forthespada / InterviewGuide

🔥🔥「InterviewGuide」是阿秀从校园->职场多年计算机自学过程的记录以及学弟学妹们计算机校招&秋招经验总结文章的汇总,包括但不限于C/C++ 、Golang、JavaScript、Vue、操作系统、数据结构、计算机网络、MySQL、Redis等学习总结,坚持学习,持续成长!
https://interviewguide.cn/
Apache License 2.0
5.37k stars 1.45k forks source link

[勘误&请教] C/C++ #89

Open EricPengShuai opened 1 year ago

EricPengShuai commented 1 year ago

基础语法

2、结构体内存对齐问题?(勘误)

单字节对齐那里
如果想使用单字节对齐的方式,使用alignas是无效的。应该使用#pragma pack(push,1)或者使用attribute((packed))

std::cout << sizeof(Info) << std::endl;   // 6 1 + 4 + 1
std::cout << alignof(Info) << std::endl;  // 6 这里应该是 1

另外想问一下为啥要写两个 #if defined(__GNUC__) || defined(__GNUG__) :前面 define,后面 undef,也就是写第二个是啥意思(为啥有 #undef

#if defined(__GNUC__) || defined(__GNUG__)
  #define ONEBYTE_ALIGN __attribute__((packed))
#elif defined(_MSC_VER)
  #define ONEBYTE_ALIGN
  #pragma pack(push,1)
#endif

struct Info {
  uint8_t a;
  uint32_t b;
  uint8_t c;
} ONEBYTE_ALIGN;

// 这里是啥意思,为啥前面 define 之后这里又 undef
#if defined(__GNUC__) || defined(__GNUG__)
  #undef ONEBYTE_ALIGN
#elif defined(_MSC_VER)
  #pragma pack(pop)
  #undef ONEBYTE_ALIGN
#endif

std::cout << sizeof(Info) << std::endl;   // 6 1 + 4 + 1
std::cout << alignof(Info) << std::endl;  // 1

3、指针和引用的区别(请教)

16.2 sizeof 补充题

在16题中有提到sizeof(str)的值为8,是在64位的编译环境下的,指针的占用大小为8字节; 而在32位环境下,指针占用大小为4字节。 一个指针占内存的大小跟编译环境有关,而与机器的位数无关。

上面不是说和64位和32位环境有关吗,为啥又说与机器的位数无关,难道是这里说的编译环境的位数和机器的位数不是一个东西么

20、C++和C语言的区别

32、C和C++的类型安全

(2)C++的类型安全

38、如何用代码判断大小端存储?

代码中判断大端哪里应该是和 0x00 比较吧,int 实际上为四个字节,其实是 0x00001234,如果判断 0x12,最好使用 short 类型?

int a = 0x1234;
char c = (char)(a);
if (c == 0x12) // 这里应该是 0x00 吧才能判断大端吧,int 实际上为四个字节,其实是 0x00001234,另一个使用 unioin 的也是
    cout << "big endian" << endl;
else if(c == 0x34)
    cout << "little endian" << endl;

40、什么情况下会调用拷贝构造函数

代码中,A& getClassA2()a4 = getClassA2(a1); 对不上

66、C++函数调用的压栈过程

当函数从入口函数main函数开始执行时,编译器会将我们操作系统的运行状态,main函数的返回地址、main的参数、mian函数中的变量、进行依次压栈;

好像说反了,感觉是变量、参数、返回地址依次入栈,参考:https://cloud.tencent.com/developer/article/1920687

C++11 新特性

2、auto、decltype和decltype(auto)的用法

decltype(auto)是C++14新增的类型指示符,可以用来声明变量以及指示函数返回类型。在使用时,会将“=”号左边的表达式替换掉auto,再根据decltype的语法规则来确定类型。

会将“=”号右边的表达式替换掉auto?

forthespada commented 1 year ago

thanks

EricPengShuai commented 1 year ago

@forthespada 请问上面提到的

3、指针和引用的区别

指针作为参数传递为啥不会改变实参的值呢

16.2 sizeof 补充题

这里说的编译环境的位数和机器的位数不是一个东西么

YalandHong commented 1 year ago

3、指针和引用的区别

指针作为参数传递为啥不会改变实参的值呢

你自己的说法是对的。形参只是实参的一个拷贝。改变形参不影响实参的值。

16.2 sizeof 补充题

这里说的编译环境的位数和机器的位数不是一个东西么

不一样。比如64位系统的GCC默认生成的是64位程序,但如果你指定-m32参数,那就会生成32位程序。