sizeof数据对齐问题】的更多相关文章

#include <iostream> using namespace std; struct A1 { int a; static int b; }; struct A2 { int a; char c; }; struct A3 { float a; char c; }; struct A4 { float a; int b; char c; }; struct A5 { double d; float a; int b; char c; }; void main() { cout<…
首先是struct,在C++中,结构体其实和class有很大的相似了.但是有一点不同的是,struct默认是public,而class中是private. 当然,struct继承等用法也是可以的. 共用体的声明方式是: 枚举的声明方式与共用体比较相似 其中a初始化为0,后面默认增1,若已经初始化,则后面再增1,比如d=6在这里. struct长度计算 大家猜一下,s1 x;int b=sizeof(x); 他的结果会是多少呢?有人会觉得应该是1+8+4+1=14. 实际上是24.为什么会是这样呢…
大体看了看数据对齐,不知道是否正确,总结如下: struct A { char name; double dHeight; int age; }; sizeof(A) = (1+7+8+4+4) = 24;  这是编译器默认下的对齐方式,struct和class一致. 如果人工添加代码设置对齐方式,如下 #pargma pack (4) struct A { char name; double dHeight; int age; }; sizeof(A) = 1+3+8+4 = 16 首先#pa…
 C/C++数据对齐汇总  这里用两句话总结数据对齐的原则: (1)对于n字节的元素(n=2,4,8,...),它的首地址能被n整除,才干获得最好的性能: (2)如果len为结构体中长度最长的变量,size为CPU(处理器)的位数,对齐规则: 若len < size,则以len为单位对齐 若len >= size,则以size为单位对齐 这里不考虑指定对齐方式的情况.   測试 struct B{ bool i; int j; bool k; }; struct A{ int j; bool…
全局存储器,即普通的显存,整个网格中的随意线程都能读写全局存储器的任何位置. 存取延时为400-600 clock cycles  很easy成为性能瓶颈. 訪问显存时,读取和存储必须对齐,宽度为4Byte.假设没有正确的对齐,读写将被编译器拆分为多次操作,减少訪存性能. 多个warp的读写操作假设可以满足合并訪问,则多次訪存操作会被合并成一次完毕.合并訪问的条件,1.0和1.1的设备要求较严格,1.2及更高能力的设备上放宽了合并訪问的条件. 1.2及其更高能力的设备支持对8 bit.16 bi…
之前若是有人拿个结构体或者联合体问我这个结构占用了多少字节的内存,我一定觉得这个人有点low, 直到某某公司的一个实习招聘模拟题的出现,让我不得不重新审视这个问题, 该问题大致如下: typedef struct _A{ char a; int b; float c; double d; int *pa; char* pc; short e; }A; #pragma pack(pop) int main(int argc, char *argv[]) { printf("size = %d\n&…
对齐 数 据的对齐(alignment)是指数据的地址和由硬件条件决定的内存块大小之间的关系.一个变量的地址是它大小的倍数的时候,这就叫做自然对齐 (naturally aligned).例如,对于一个32bit的变量,如果它的地址是4的倍数,-- 就是说,如果地址的低两位是0,那么这就是自然对齐了.所以,如果一个类型的大小是2n个字节,那么它的地址中,至少低n位是0.对齐的规则是由硬件引起 的.一些体系的计算机在数据对齐这方面有着很严格的要求.在一些系统上,一个不对齐的数据的载入可能会引起进程…
概述: 数据对齐指数据在计算机内存中排放和获取的方式.包含三个方面:数据对齐(data alignment).数据结构填充(data alignment).打包(packing) 如果数据是自然对齐的话,CPU读写会更高效.自然对齐指数据地址是数据大小的倍数.为保证自然对齐,可能会在结构的开头或结尾进行一些填充 定义: 内存地址对齐:一个内存地址a被称为n-byte对齐,如果a是n的倍数,其中n是2的幂.因此n对齐的地址的低log2(n)位是0 n-bit对齐 = n/8-byte对齐 内存读取…
数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍.DWORD数据的内存起始地址能被4除尽,WORD数据的内存起始地址能被2除尽.X86 CPU能直接访问对齐的数据,当它试图访问一个未对齐的数据时,会在内部进行一系列的调整.这些调整对于程序员来说是透明的,但是会降低运行速度,所以编译器在编译程序时会尽量保证数据对齐. 不同的编译器内存对齐的方式不同. 一个小例子:在32位的机器上,数据是以4字节为对齐单位,这两个类的输出结果为什么不同?(VS2008) #include <iostream…
原文链接:http://www.catb.org/esr/structure-packing/ 谁应阅读本文 本文探讨如何通过手工重新打包C结构体声明,来减小内存空间占用.你需要掌握基本的C语言知识,以理解本文所讲述的内容. 如果你在内存容量受限的嵌入式系统中写程序,或者编写操作系统内核代码,就有必要了解这项技术.如果数据集巨大,应用时常逼近内存极限,这项技术会有所帮助.倘若你非常非常关心如何最大限度地减少处理器缓存段(cache-line)未命中情况的发生,这项技术也有所裨益. 最后,理解这项…