linux和windows gcc g++ vc编译器字节对齐
来源:互联网 发布:sql创建主键语句 编辑:程序博客网 时间:2024/06/11 06:59
首先可以肯定的说,肯定和编译器有关,vc编译器和gcc,g++编译器肯定不一样,不说明是什么编译器什么系统下问你结构体长度就是在耍流氓。
(1)vc编译器下结构体成员首地址地址必须被该结构体成员长度整除,打个比方,double a的首地址如果为0x06, 那是不行的,再填2个字节将其首地址变为0x08。并且最后的字节总长度为最宽长度的整数倍,不足补齐(都是按照对齐模数来的)
(2)gcc和g++编译器是按照对齐模数来对齐的,double类型首元素地址如果为0x04,那么它不用再往里填4个字节补齐,因为32位linux系统gcc编译器对齐模数默认为4,如果为64
位系统gcc编译器对齐模数默认为8.当然g++编译器也一样,还有32位linux gcc编译器对齐模数为1,2,4, 64位linux gcc编译器对齐模数1,2,4,8。程序选择对齐模数应该是找大于结构体成员字节数最大值的对齐模数,不超过对齐模数的最大值(4或8)。同时最后的结构体字节数总和必须是对齐模数的整数倍,不足补齐。
(3)gcc中如果结构体内有另一个结构体对象,则字节对齐应该是按照不超过结构体内成员最大占用字节数的对齐模数来设置的,如果struct test对齐模数是4,则从是4的整数倍地址作为结构体对象成员首地址就可以了
说了这么多给了例子
struct test
{
int a;
int b;
double c;
char d;
};
test one;
struct pp
{
int m;
struct test n;
};
test two;
32 位linux gcc编译器 one:20个字节(4+4+8+1+3 ), two:24个字节(4+20)
64位linux g++编译器 one:24个字节(4+4+8+1+7),two:32个字节(8+24)
windows vc编译器one:24个字节(4+4+8+1+7),two:(32个字节)(8+24)
- linux和windows gcc g++ vc编译器字节对齐
- 字节对齐---arm-linux-gcc和gcc
- gcc和g++编译器
- Windows和Linux下的字节对齐
- Windows和Linux下的字节对齐
- windows、linux 字节对齐
- linux gcc/g++编译器使用
- Linux gcc/g++编译器使用
- 结构体字节对齐和位域对齐——VC、gcc
- 结构体字节对齐和位域对齐——VC、gcc
- 结构体字节对齐和位域对齐——VC、gcc
- 结构体字节对齐和位域对齐——VC、gcc
- unix编译器gcc和g++
- Linux环境下的编译器 gcc和g++
- Linux系统编译器GCC和g++的重要区…
- gcc和vc编译器区别
- 关于VS和GCC字节对齐
- Linux 下的 gcc, g++ 编译器
- 51nod 1603 限高二叉排列树(求补思想->DP)
- 在cmakeLists中这是多平台兼容
- constexpr
- java面试题全集(上)
- 简单工厂模式
- linux和windows gcc g++ vc编译器字节对齐
- MFC 拖拽文件到Edit控件后在Edit中显示文件路径及名称
- 多态
- java必备软件
- apk so裁剪相关
- 此博客仅用作在执行一些东西遇到的问题记录以及查找到的解决方案记录:
- Mybatis --- 创建方法、全局配置
- nullptr,NULL,0
- dll导出(无法解析的外部符号 "__declspec(dllimport))