linux和windows gcc g++ vc编译器字节对齐
2017-09-15 16:16
363 查看
首先可以肯定的说,肯定和编译器有关,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)
(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)
相关文章推荐
- Thinking In Linux C/C++字节对齐详解
- Windows和Linux下的字节对齐
- arm-linux-gcc 与 gcc 关于字节对齐问题
- (原创)Linux下一定要4字节地址对齐操作
- Linux下的 arm-linux-gcc 与 gcc 关于字节对齐问题
- unix/linux 字节对齐补齐
- LINUX下设置字节对齐问题
- Thinking In Linux C/C++字节对齐详解
- Linux下字节对齐准则
- linux的nand中计算ECC的时候buf地址不4字节对齐的问题
- 学习笔记 linux 结构体字节对齐
- Linux平台与Windows平台字节对齐(一)
- Linux socket.h 中 CMSG_ALIGN 宏定义的作用(字节对齐)
- Linux 字节序与字节对齐优化
- Arm-linux平台(海思hi3518E)字节对齐方式
- 嵌入式Linux C语言(六)——内存字节对齐
- linux下字节对齐
- windows和Linux之间socket传输结构体关于字节对齐产生的问题
- linux下字节对齐
- 字节对齐---arm-linux-gcc和gcc