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.

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-11 01:47:48

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++各种数据类型转换汇总

以下是Windows/Linux系统中常用的C/C++各种数据类型转换汇总: #include <stdio.h> #include <stdlib.h> #include <iostream> #include <string> #include <string.h> int main() { // 1--> int to char[] int tmp1 = 100; char ch1[15]; sprintf(ch1, "%d

AspxGridView 数据的汇总统计

AspxGridView底部增加数据汇总行 这个功能在AspxGridView中不用复杂的代码实现, 实际上只是设置下GridView的属性而已 1. ShowFooter设置为True,即显示. 位置:Grid属性->Settings->ShowFooter 设置其值为True. 2. TotalSummary 位置:Grid属性->TotalSummary 增加SummaryItem, 每个SummaryItem即为一个统计列. 新增加的SummaryItem 属性: 1)Field