### C++ `sizeof` 使用规则及陷阱分析 #### 一、`sizeof` 概念介绍 在C++中,`sizeof` 是一个关键字,用于获取变量或类型(包括聚合类型)所占用的存储空间大小(以字节为单位)。这个关键字返回一个 `size_t` 类型的值。 #### 二、`sizeof` 的基本用法 1. **获取基本类型的大小**:可以直接通过 `sizeof` 关键字来获取不同数据类型所占的字节数。 - 示例: ```cpp cout << sizeof(int) << endl; // 输出 int 类型所占的字节数,在32位系统中通常为4 cout << sizeof(1 == 2) << endl; // bool 值的大小,与 `sizeof(bool)` 相同 cout << sizeof(float) << endl; // float 类型的大小 ``` 2. **获取变量的大小**:可以获取特定变量的大小。 - 示例: ```cpp int a = 0; cout << sizeof(a) << endl; // 输出变量 a 的大小 ``` 3. **表达式求值**:当 `sizeof` 操作符应用于表达式时,表达式的求值发生在编译期,且只计算表达式中各个变量或常量的类型。 - 示例: ```cpp int a = 0; cout << sizeof(a = 3) << endl; // 输出 int 类型的大小 ``` #### 三、`sizeof` 的常见陷阱 1. **函数调用与 `sizeof`**:如果尝试获取函数调用的结果大小,则实际上获取的是函数返回值类型的大小。 - 示例: ```cpp int f1() { return 0; } double f2() { return 0.0; } void f3() {} cout << sizeof(f1()) << endl; // 输出 int 类型的大小 cout << sizeof(f2()) << endl; // 输出 double 类型的大小 cout << sizeof(f3()) << endl; // 编译错误,因为 f3() 返回 void 类型 ``` 尝试使用 `sizeof` 获取函数指针或函数名称的大小是不允许的,会引发编译错误。 2. **类型名与括号**:在使用 `sizeof` 时,必须正确地使用括号。 - 示例: ```cpp cout << sizeof(int) << endl; // 正确,获取 int 类型的大小 cout << sizeof int << endl; // 错误,会被解释为 int sizeof(int),除非定义了名为 sizeof 的 int 类型变量 ``` 3. **复合类型的大小**:对于数组和结构体等复合类型,`sizeof` 会返回整个类型的大小。 - 示例: ```cpp char a[] = "abcdef"; int b[20] = {3, 4}; char c[2][3] = {"aa", "bb"}; cout << sizeof(a) << endl; // 输出数组 a 的大小,包括结束符 '\0' cout << sizeof(b) << endl; // 输出数组 b 的总大小 cout << sizeof(c) << endl; // 输出二维字符数组 c 的总大小 ``` 4. **指针的大小**:无论指向什么类型的指针,其本身在32位系统中总是占用4个字节,在64位系统中占用8个字节。 - 示例: ```cpp cout << sizeof(string*) << endl; // 输出 string 指针的大小 cout << sizeof(int*) << endl; // 输出 int 指针的大小 cout << sizeof(char****) << endl; // 输出多级 char 指针的大小 ``` 5. **typedef 与 `sizeof`**:使用 `typedef` 定义的新类型与原有类型具有相同的大小。 - 示例: ```cpp typedef short WORD; typedef long DWORD; cout << (sizeof(short) == sizeof(WORD)) << endl; // 输出 1,表示两者的大小相同 cout << (sizeof(long) == sizeof(DWORD)) << endl; // 输出 1,表示两者的大小相同 ``` #### 四、`sizeof` 在不同平台的表现 - 在32位系统中,指针通常占用4个字节;而在64位系统中,指针通常占用8个字节。 - 对于数组,`sizeof` 返回整个数组的大小,包括所有元素的总和。 #### 五、总结 `sizeof` 是C++中非常有用的关键字,用于获取变量或类型的大小。正确理解和使用它可以避免很多潜在的问题。需要注意的是,`sizeof` 的行为在不同编译器和平台上可能会有所不同,因此编写代码时应该考虑到这些差异。此外,使用 `sizeof` 时还应注意常见的陷阱,如不正确的括号使用、对函数调用的误解等。遵循上述规则和建议可以帮助开发者更有效地利用 `sizeof` 来优化程序性能和内存使用。


















1、什么是sizeof
首先看一下sizeof在msdn上的定义:
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.
看到return这个字眼,是不是想到了函数?错了,sizeof不是一个函数,你见过给一个函数传参数,而不加括号的吗?sizeof可以,所以sizeof不是函数。网上有人说sizeof是一元操作符,但是我并不这么认为,因为sizeof更像一个特殊的宏,它是在编译阶段求值的。举个例子:
cout<<sizeof(int)<<endl; // 32位机上int长度为4
cout<<sizeof(1==2)<<endl; // == 操作符返回bool类型,相当于 cout<<sizeof(bool)<<endl;
在编译阶段已经被翻译为:
cout<<4<<endl;
cout<<1<<endl;
这里有个陷阱,看下面的程序:
int a = 0;
cout<<sizeof(a=3)<<endl;
cout<<a<<endl;
输出为什么是4,0而不是期望中的4,3???就在于sizeof在编译阶段处理的特性。由于sizeof不能被编译成机器码,所以sizeof作用范围内,也就是()里面的内容也不能被编译,而是被替换成类型。=操作符返回左操作数的类型,所以a=3相当于int,而代码也被替换为:
int a = 0;
cout<<4<<endl;
cout<<a<<endl;
所以,sizeof是不可能支持链式表达式的,这也是和一元操作符不一样的地方。
结论:不要把sizeof当成函数,也不要看作一元操作符,把他当成一个特殊的编译预处理。
2、sizeof的用法
sizeof有两种用法:
(1)sizeof(object)
也就是对对象使用sizeof,也可以写成sizeof object 的形式。
(2)sizeof(typename)
也就是对类型使用sizeof,注意这种情况下写成sizeof typename是非法的。下面举几个例子说明一下:
int i = 2;
cout<<sizeof(i)<<endl; // sizeof(object)的用法,合理
cout<<sizeof i<<endl; // sizeof object的用法,合理
cout<<sizeof 2<<endl; // 2被解析成int类型的object, sizeof object的用法,合理
cout<<sizeof(2)<<endl; // 2被解析成int类型的object, sizeof(object)的用法,合理
cout<<sizeof(int)<<endl;// sizeof(typename)的用法,合理
cout<<sizeof int<<endl; // 错误!对于操作符,一定要加()
可以看出,加()是永远正确的选择。
结论:不论sizeof要对谁取值,最好都加上()。
3、数据类型的sizeof
(1)C++固有数据类型
剩余14页未读,继续阅读


- 粉丝: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 单片机校园时间控制系统开题研究报告.doc
- 试论网络思想政治教育评价的特性.docx
- 计算机图形学与图形图像处理技术研究.docx
- 信息化时代医院文书档案管理工作的方法及策略.docx
- 基于单片机的花样电子时钟设计与制作.doc
- 单片机课题评测研究报告.doc
- (源码)基于Spring和物联网的智能饮品监测管理系统.zip
- 电力工程中输电线路施工项目管理存在的问题及对策分析.docx
- 一下找规律MicrosoftPowerPoint演示文稿.ppt
- 面向对象程序设计课程设计专业技术方案.doc
- 2025WAIC世界人工智能大会综合专业报告
- 基于五个对接的机械制造与自动化专业人才培养模式.docx
- 计算机在民政局社会福利中心科技管理中的应用与创新.docx
- 唐山首钢马兰庄铁矿有限责任公司dmine矿业软件在地质工作中应用.doc
- 肠结核结核性腹膜炎网络版.ppt
- (源码)基于C#的火车票预订系统.zip


