C / C++ 处理空结构体异同
来源:互联网 发布:爱家市场网络不稳定 编辑:程序博客网 时间:2024/06/05 14:59
闲来无事,尝试下面的代码 :
(64位OpenSuse机器)
#include <stdio.h>struct Empty{};struct EEmpty{ struct Empty e; struct Empty e1;};int main(){ printf("size of Empty struct is : %d\n", sizeof(struct Empty)); printf("size of EEmpty struct is : %d\n", sizeof(struct EEmpty)); struct Empty w; int a; printf("Addr w : %p\n", &w); printf("Addr a : %p\n", &a); return 0;}
首先使用GCC编译 :
xxx@WS-TAO0023:gcc c_test.c xxx@WS-TAO0023:./a.out
输出:
size of Empty struct is : 0 size of EEmpty struct is : 0 Addr w : 0x7fffe51b9710Addr a : 0x7fffe51b970c
然后使用G++编译 :
xxx@WS-TAO0023:g++ c_test.c xxx@WS-TAO0023:./a.out
输出:
size of Empty struct is : 1size of EEmpty struct is : 2Addr w : 0x7fffa7513b1fAddr a : 0x7fffa7513b18
可以看到为了保证每个变量(对象) 有唯一的内存地址 :
* C++编译器强制让空结构体大小为1 byte
* C编译器虽然保持空结构体大小为 0 , 但是仍然为它类型的变量分配了空间 .
考虑到内存对齐会导致上面的地址差距大于实际上空结构体占有的内存大小, 对代码进行修改:
//int a; 替换成下面一行 char a;
GCC下编译得到 :
size of Empty struct is : 0 bytesize of EEmpty struct is : 0 byteAddr w : 0x7fff683b6150Addr a : 0x7fff683b614f
G++下编译得到
size of Empty struct is : 1 bytesize of EEmpty struct is : 2 byteAddr w : 0x7fff5ce39fefAddr a : 0x7fff5ce39fee
可见对于空结构体, 大家都只给它最小的1 byte 的内存 .
0 0
- C / C++ 处理空结构体异同
- C++、 C 中的结构体、联合和枚举 异同
- C/C++空结构体,空数组,空类作用
- 结构体在C与C++中的异同
- C语言中的结构体与C++中的类异同
- 结构体与类的异同(在C与c++)
- C语言_空结构体的大小
- B/S与C/S结构的异同
- C++&JAVA异同
- C/C++ :static异同
- C/C++异同
- C/C++异同
- 结构体 (C/C++)
- C/C++:结构体指针
- (C/C++)struct结构体
- C语言中处理结构体的原理
- 第十六周:C语言:用结构体处理复数运算
- struct来处理C语言中的结构体
- X86 基本寄存器介绍
- 关于新站长怎么学习网站建设和网站优化技巧!
- ios开发之APP升级的实现
- Android系统dimension单位详解
- hadoop官网
- C / C++ 处理空结构体异同
- 新手如何备考GRE考试作文
- gcc和make的区别
- java基础
- 源码安装apache&mysql加入到系统服务
- xStream
- 实习事宜
- w3cschool
- jdbc 链接数据库工具类