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<<sizeof(A1)<<endl;
    cout<<sizeof(A2)<<endl;
    cout<<sizeof(A3)<<endl;
    cout<<sizeof(A4)<<endl;
    cout<<sizeof(A5)<<endl;
}

分析如下:


A1:sizeof只计算栈中分配的大小,而b是静态变量,位于全局数据区,所以不占用栈的空间,所以A1的大小只是a占用的空间,即4;


A2:数据对齐,int大小为4;char大小为1,扩展为4,所以A2为8;


A3:数据对齐:float大小为4;char大小为1,扩展为4,所以A3为8;


A4:数据对齐:float大小为4;int大小为4;char大小为1,扩展为4,所以A3为12;


A5:数据对齐:double大小为8;float大小为4,int大小为4,float和int共占8;char大小为1,考虑对齐,扩展为8;所以A4为24;

转载自:http://blog.csdn.net/tangbo1987/article/details/6766918
时间: 2024-12-19 06:55:07

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

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

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

数据对齐总结

必须注意:对齐是多少字节对齐,不是多少位对齐. 对齐原因: 如上图片,内存一般是四个单位一列,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)未命中情况的发生,这项技术也有所裨益. 最后,理解这项

【转】彻底搞清计算结构体大小和数据对齐原则

彻底搞清计算结构体大小和数据对齐原则 数据对齐: 许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是 某个值K(通常是2,4或8)的倍数.这种对齐限制简化了形成处理器和存储器系统之间的接口的硬件 设计.例如,假设一个处理器总是从存储器中取出8个字节,则地址必须为8的倍数.如果我们能保 证将所有的double类型数据的地址对齐成8的倍数,那么就可以用一个存储器操作来读或者写值了. 否则,我们可能需要执行两次存储器访问,因为对象可能被分放在两个8字节存储块中. 当数据类

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

数据对齐/内存对齐 &amp;&amp; 数据格式

一.数据对齐/内存对齐 字.双字.四字在自然边界上不需要在内存中对齐.(什么叫做字?见第二部分) 对字.双字.四字来说,自然边界分别是偶数地址.可以被4整除的地址.可以被8整除的地址. 无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐. 原因在于,为了访问未对齐的内存,处理器需要做两次内存访问:然而,对齐的内存仅需要一次访问. 未对齐的:一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界,被认为是未对齐的,需要两次总线周期访问内存. 对齐的:一个