C++ struct结构体内存对齐】的更多相关文章

•小试牛刀 我们自定义两个结构体 A 和 B: struct A { char c1; char c2; int i; double d; }; struct B { char c1; int i; char c2; double d; }; 通过定义我们可以看出,结构体 A 和 B 拥有相同的成员,只不过在排列顺序上有所不同: 众所周知,char 类型占 1 个字节,int 类型占 4 个字节,double 类型占 8 个字节: 那么,这两个结构体所占内存空间大小为多少呢?占用的空间是否相同?…
在空间看到别人的疑问引起了我的兴趣,刚好是我感兴趣的话题,就写一下.为了别人的疑问,也发表在qq空间里.因为下班比较晚,10点才到家,发表的也晚.其实是个简单的问题.  直接用实例和内存图说明: #include <iostream> using std::cout; using std::cin; struct stu { char sex; int length; ]; }; void main() { stu stu0; stu0.sex = 'f'; stu0.length = ; s…
17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊socket类型,主要用于高效的IPC,特点主要在于高效(因为省去了很多与数据无关的格式的要求). int socketpair(int domain, int type, int protocol, int sockfd[2]) 这个函数用于构建一对unix domain sockets:并且与之前…
最近闲来无事,翻阅msdn,在预编译指令中,翻阅到#pragma pack这个预处理指令,这个预处理指令为结构体内存对齐指令,偶然发现还有另外的内存对齐指令aligns(C++11),__declspec(align(#))(Microsoft专用),遂去探究两者之间的不同点. 1.#pragma pack 这个指令为预处理指令,所谓与处理指令执行在程序的预处理阶段,该指令对应着编译选项/Zp,可以在vs的工程属性中设置编译选项的内存对齐,也可以利用预处理指令来设置. #pragma pack(…
一. 基本原则 1. struct中成员变量的声明顺序,与成员变量对应的内存顺序是一致的: 2. struct本身的起始存储地址必须是成员变量中最长的数据类型的整倍数,注意是最长的数据类型,而不是最长的变量 3. 内存对齐与编译器设置有关. 二. 计算规则(以下的所有规则,必须同时满足,并不是满足其中一条即可) 1. 每个成员变量相对于struct起始地址的偏移量,必须是成员变量自身类型长度的最小整倍数 int number:是声明的第一个成员变量,相对于S001起始地址的偏移量为0 doubl…
一.为什么要内存对齐 经过内存对齐之后,CPU的内存访问速度大大提升; 内存空间按照byte划分,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 各个硬件平台对存储空间的处理上有很大的不同.如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失. 比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶…
简述: alignas(x):指定结构体内某个成员的对齐字节数,指定的对齐字节数不能小于它原本的字节数,且为2^n; #pragma pack(x):指定结构体的对齐方式,只能缩小结构体的对齐数,且为2^n: 优先级比aligns高 alignof(variable):获取变量的对齐字节数 用例: 结果:注释pack 1 sizeof(data) = 16 2 align(data) = 8 3 4 sizeof(c) = 16 5 align(c) = 8 6 7 sizeof(d) = 16…
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢? 开始学的时候,也被此类问题困扰很久.其实相关的文章很多,感觉说清楚的不多.结构体到底怎样对齐? 有人给对齐原则做过总结,具体在哪里看到现在已记不起来,这里引用一下前人的经验(在没有#pragma pack宏的情况下): 原则1.数据成员对齐规则:结构(struct或…
0x00简介 首先要知道结构体的对齐规制 1.第一个成员在结构体变量偏移量为0的地址处 2.其他成员变量对齐到某个数字的整数倍的地址处 对齐数=编辑器默认的一个对齐数与该成员大小的较小值 vs中默认的值为8 gcc 没有默认就是累加 3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍 4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整数体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍 0x01结构体 如下代码 #include <stri…
cpu要想从内存读取数据,需要通过地址总线,把地址传输给内存,内存准备好数据,输出到数据总线,交给cpu,如果地址总线只有8根,那这个地址就只有8位可以表示[0,255]256个地址,因为表示不了更多的地址,就用不了更大的内存,所以256就是8根地址总线最大的寻址空间,要使用更大的内存,就要有更宽的地址总线,例如32位地址总线就可以寻址4G内存了,每次操作1字节太慢,那就加宽数据总线,要想每次操作4字节,就要至少32位数据总线,8字节就要64位,这里每次擦操作的字节数,就是所谓的机器字长.…