温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

c++中的结构体内存怎么对齐

发布时间:2020-12-17 16:33:48 来源:亿速云 阅读:171 作者:Leah 栏目:开发技术

今天就跟大家聊聊有关c++中的结构体内存怎么对齐,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

基本概念:

各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数, 各成员变量在存放的时候根据在结构中出现的顺序依次申请空间 同时按照上面的对齐方式调整位置。 空缺的字节自动填充, 同时为了确保结构的大小为结构的字节边界数(即该结构中占用最大的空间的类型的字节数)的倍数,所以在为最后一个成员变量申请空间后 还会根据需要自动填充空缺的字节;

举例说明:

#include <iostream>

using namespace std;

#pragma pack(8)
struct Test1
{
 char a; //0 - 1
 short b;//2 - 3
 int c;// 4 - 7
 float d;//8 - 11
 double e;//12 - 23
};

#pragma pack(4)
struct Test2
{
 char a; //0 - 1
 short b;//2 - 3
 int c;// 4 - 7
 float d;//8 - 11
 double e;//12 - 19
};

#pragma pack(8)
struct Test3
{
 double e;//0-7
 float d;//8-13
 short b;//14-15
 int c;// 16-19
 char a; //20-23
};

int main()
{
 std::cout << "size test1= " << sizeof(Test1) << std::endl;
 std::cout << "size test2= " << sizeof(Test2) << std::endl;
 std::cout << "size test3= " << sizeof(Test3) << std::endl;
 return 0;
}

结构体内存对齐规则

1)第一个成员在与结构体偏移量为0的地址处。
2)其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
      注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
      VS中默认的对齐数为8,gcc中的对齐数为4
3)结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
4)如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

看完上述内容,你们对c++中的结构体内存怎么对齐有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI