C/C++数据对齐总结

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 i;
bool k;
};
cout<<sizeof(B)<<endl;
cout<<sizeof(A)<<endl;
输出结果: 12 8

理解起来也不难,一般情况下,地址总线总是按照对齐后的地址来访问,例如你想得到0x0000 0001开始的4字节内容,系统首先要以0x0000 0000开始,获得一个4字节,然后从中去除三字节,接着又以0x0000 0004开始,取出一个四字节,然后 取出一字节,两次组合你想得到的内容,然而如果初始地址一开始就是0x0000
0000那么就只要一次就行了。所以对于B来说,按四字节对齐假设i的地址是0x0000 0000 那么为了一次取出j那么j的地址必须为0x0000 0004,由于四字节对齐k也要占四字节。而A中假设j的地址是0x0000 0000,那么i为0x0000 0004很合理,且当k地址为0x0000 0002时同样可以一次取出,所以一共8字节。

对于sizeof有个需要注意的地方:

struct C{
int a;
static int b;
};
cout<<sizeof(C)<<endl;

结果:4

解释:因为静态变量是存放在全局区,而sizeof计算栈中分配的大小,是不会计算在内的,所有结果为4.

C/C++数据对齐总结

时间: 2024-12-16 19:12:12

C/C++数据对齐总结的相关文章

gpu显存(全局内存)在使用时数据对齐的问题

全局存储器,即普通的显存,整个网格中的任意线程都能读写全局存储器的任意位置. 存取延时为400-600 clock cycles  非常容易成为性能瓶颈. 访问显存时,读取和存储必须对齐,宽度为4Byte.如果没有正确的对齐,读写将被编译器拆分为多次操作,降低访存性能. 多个warp的读写操作如果能够满足合并访问,则多次访存操作会被合并成一次完成.合并访问的条件,1.0和1.1的设备要求较严格,1.2及更高能力的设备上放宽了合并访问的条件. 1.2及其更高能力的设备支持对8 bit.16 bit

erlang shell表格数据对齐

最近在erlang shell做一些测试,为了让测试结果数据显得更直观,想对齐需要打印的数据,做成像表格一样的效果. 开始的想法是在数据中插入tab.当然,erlang也有对tab的支持,但实际效果不理想. 对tab的支持如下: 1> io:format("No1~sNo2~n1~s2~n", ["\t", "\t"]). No1        No2 1             2 ok 但数据的长度超过8个字符就有问题,那有没有一种可以

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<

Ultra Edit中的数据对齐

有时会用到Ultra Edit的数据对齐功能.比如,要求64个符号一组,从低位开始对齐.这时,如果数据长度不是一行长度的整数, 就会产生高位对齐.低位不足的问题.为了调整,往往需要逐行调整,很不方便. 有一个优化的方法,先计算数据长度除以"行长度"的余数,然后在数据首位前补足零,以保证整除.之后自动对齐,没有低位不足 的问题.

gcc 数据对齐之:总结篇.

通过上面的分析,总结结构体对齐规则如下: 1.数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行.2.结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行.3.结合1.2颗推断:当#pragma p

数据对齐总结

必须注意:对齐是多少字节对齐,不是多少位对齐. 对齐原因: 如上图片,内存一般是四个单位一列,CPU在读取内存数据的时候,通过总线并行读取每个单位的数据.对于CPU 32bit的寄存器而言. 0-7bit是来自于内存芯片0的位 8-15bit是来自内存芯片1的位 16-23bit是来自芯片2 24-31来自芯片3 而内存结构是,内存地址一个单位也就是基本单位是1字节,也就是8位二进制数. 在读取数据的时候实际上是0-7位从芯片0读取,8到15位从芯片2读取,以此类推. 所以读取一个4字节数据,是

内存中的数据对齐

数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍.DWORD数据的内存起始地址能被4除尽,WORD数据的内存起始地址能被2除尽.x86 CPU能直接访问对齐的数据,当它试图访问一个未对齐的数据时,会在内部进行一系列的调整.这些调整对于程序来说是透明的,但是会降低运行速度,所以编译器在编译程序时会尽量保证数据对齐.同样一段代码,我们来看看用VC.Dev C++和LCC这3个不同的编译器编译出来的程序的执行结果: 这是用VC编译后的执行结果: 变量在内存中的顺序:b(1字节)-a(4字节)-

C/C++数据对齐汇总

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 i; b

数据对齐与代码优化笔记

1. 一直以来对数据对齐都不明白,直到看了这篇文章后才能说是有点感觉,结合代码将理解写下来,以备将来回头加深理解或者是修正错误的认知. http://www.searchtb.com/2013/04/performance_optimization_tips.html 代码如下,运行的环境是64位的linux机器,内核3.10,gcc 4.8.2 /*************************************************************************

gcc数据对齐之: howto 2.

原文链接:http://www.catb.org/esr/structure-packing/ 谁应阅读本文 本文探讨如何通过手工重新打包C结构体声明,来减小内存空间占用.你需要掌握基本的C语言知识,以理解本文所讲述的内容. 如果你在内存容量受限的嵌入式系统中写程序,或者编写操作系统内核代码,就有必要了解这项技术.如果数据集巨大,应用时常逼近内存极限,这项技术会有所帮助.倘若你非常非常关心如何最大限度地减少处理器缓存段(cache-line)未命中情况的发生,这项技术也有所裨益. 最后,理解这项