### C++面试题详解:深入理解SIZEOF与CONST #### SIZEOF预处理题目解析 **1. 对于结构体的对齐方式** - **结构体s的对齐规则**:`struct s { char a; int b; }; sizeof(s) = 8;` 当结构体内的元素长度小于处理器位数时,结构体将根据最长元素进行对齐。在这个例子中,`char a`按1字节对齐,`int b`按4字节对齐。由于`int`通常占用4字节,因此结构体`s`的总大小是8字节,满足了4字节的对齐要求。 - **结构体A的对齐规则**:`struct A { short a1; short a2; short a3; }; sizeof(A) = 6;` 结构体A中的所有元素都是`short`类型,每个`short`按2字节对齐。因此,整个结构体A也按2字节对齐,其大小为6字节。 **2. 数组和指针的sizeof差异** - **数组的大小计算**:`int a[200]; sizeof(a) = 200 * sizeof(int) = 800;` 这里计算的是整个数组的大小,即200个`int`的大小。 - **动态数组指针的大小**:`int *a = new int[200]; sizeof(a) = 4;` `sizeof(a)`返回的是指针本身的大小,而不是它所指向的数组大小,在32位系统中,指针通常占用4字节。 **3. 字符串数组的sizeof行为** - **字符串数组的大小**:`char str[] = "012345"; sizeof(str) = 7;` 字符串数组的大小包括字符串的实际长度加上一个空终止符`\0`。因此,`"012345"`长度为6,加上空终止符,总共7字节。 **4. 位域的大小计算** - **位域的大小**:`struct b { char a : 8; char b : 4; char c : 2; char d : 3; }; sizeof(b) = 3;` 位域元素的最大总和为1字节(8bits),在这个例子中,`b`和`c`共用一个字节,剩余的`d`占用另一个字节的一部分,最后得到的大小是3字节。 **5. 联合与结构体的大小** - **联合的大小**:`union V { struct X { unsigned char s1 : 2; unsigned char s2 : 3; unsigned char s3 : 3; } x; unsigned char c; } v;` 联合的大小等于其成员中最大的类型大小。在这个例子中,`struct X`的大小取决于它的位域成员,它们共享一个字节,而`unsigned char c`也是一个字节,因此`union V`的大小为1字节。 **6. 类的sizeof行为** - **空类的大小**:`class A {}; sizeof(A) = 1;` 空类默认会有一个占位符,确保类实例不会占据0字节空间。 - **含虚函数的类的大小**:`class A { virtual test(); }; class B : public A {}; sizeof(A) = 4; sizeof(B) = 4` 含有虚函数的类会包含一个虚函数指针(`vptr`),指向虚函数表(`vtable`),这通常占用4字节。 **7. 静态成员与虚拟继承的影响** - **静态成员对类大小的影响**:`class A { static int a; }; sizeof(A) = 1;` 静态成员变量分配在全局存储区,不影响类的大小。 - **虚拟继承对类大小的影响**:`class C : public virtual A {}; sizeof(C) = 4;` 虚拟继承的类同样会包含虚函数表指针。 **8. 复杂类型的sizeof计算** - **联合和结构体的嵌套使用**:`struct data { int cat; DATE cow; double dog; } too;` 结构体的大小计算需要考虑内部成员的对齐方式。`DATE`是一个联合,其大小由其内部成员中最大的类型决定。在`struct data`中,`DATE cow`的大小为联合`DATE`的最大成员大小,再加上`int cat`和`double dog`的大小,最终得出整个结构体的大小。 **9. 动态内存分配与sizeof** - **动态分配内存的大小**:`void *pp = malloc(10); sizeof(pp) = 4;` `sizeof`操作符只适用于静态分配的对象或变量,无法检测动态分配的内存大小。 **10. 函数参数与数组** - **数组作为函数参数的行为**:`void Func(char str[100]) { printf("%d\n", sizeof(str)); }` 在C++中,数组作为函数参数时会退化为指针。这意味着`sizeof(str)`实际上计算的是指针的大小,而非数组的大小。要正确获取数组的实际大小,需要使用引用的方式传递数组。 #### CONST常见题目解析 **1. const与#define的区别** - **类型安全**:`const`具有类型安全特性,可以进行类型检查,而`#define`仅仅进行文本替换,不进行类型检查。 - **调试支持**:某些编译器支持对`const`进行调试,但不支持对`#define`进行调试。 - **函数参数与返回值修饰**:`const`可以用于修饰函数参数和返回值,甚至在C++中修饰函数,定义内联函数等,提供额外的控制和信息。 C++的`sizeof`和`const`特性提供了丰富的工具来处理类型大小、对齐和常量定义。理解这些概念对于优化代码性能和维护代码质量至关重要。在准备C++面试时,深入了解这些细节将有助于提升应试者的竞争力。
- 粉丝: 1
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于javaweb的网上拍卖系统,采用Spring + SpringMvc+Mysql + Hibernate+ JSP技术
- polygon-mumbai
- Chrome代理 switchyOmega
- GVC-全球价值链参与地位指数,基于ICIO表,(Wang等 2017a)计算方法
- 易语言ADS指纹浏览器管理工具
- 易语言奇易模块5.3.6
- cad定制家具平面图工具-(FG)门板覆盖柜体
- asp.net 原生js代码及HTML实现多文件分片上传功能(自定义上传文件大小、文件上传类型)
- whl@pip install pyaudio ERROR: Failed building wheel for pyaudio
- Constantsfd密钥和权限集合.kt