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++数据对齐汇总的更多相关文章

  1. C++中数据对齐

    大体看了看数据对齐,不知道是否正确,总结如下: struct A { char name; double dHeight; int age; }; sizeof(A) = (1+7+8+4+4) =  ...

  2. AspxGridView 数据的汇总统计

    AspxGridView底部增加数据汇总行 这个功能在AspxGridView中不用复杂的代码实现, 实际上只是设置下GridView的属性而已 1. ShowFooter设置为True,即显示. 位 ...

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

    全局存储器,即普通的显存,整个网格中的随意线程都能读写全局存储器的任何位置. 存取延时为400-600 clock cycles  很easy成为性能瓶颈. 訪问显存时,读取和存储必须对齐,宽度为4B ...

  4. 结构体的数据对齐 #pragma浅谈

    之前若是有人拿个结构体或者联合体问我这个结构占用了多少字节的内存,我一定觉得这个人有点low, 直到某某公司的一个实习招聘模拟题的出现,让我不得不重新审视这个问题, 该问题大致如下: typedef ...

  5. sizeof数据对齐问题

    #include <iostream> using namespace std; struct A1 { int a; static int b; }; struct A2 { int a ...

  6. CSAPP阅读笔记-struct, union, 数据对齐-来自第三章3.9的笔记-P183-P191

    1.数据对齐 为什么要对齐:通俗点解释就是CPU对数据访问时,每次都是取固定数量的字节数,假如一次取4个字节,若有个int存在0x01-0x04,则一次就能取出,若存在0x03-0x06,则需要分两次 ...

  7. 数据对齐 posix_memalign 函数详解

    对齐 数 据的对齐(alignment)是指数据的地址和由硬件条件决定的内存块大小之间的关系.一个变量的地址是它大小的倍数的时候,这就叫做自然对齐 (naturally aligned).例如,对于一 ...

  8. C++中数据对齐问题。struct、union、enum,类继承。再谈sizeof()

    首先是struct,在C++中,结构体其实和class有很大的相似了.但是有一点不同的是,struct默认是public,而class中是private. 当然,struct继承等用法也是可以的. 共 ...

  9. data structure alignment(数据对齐)

    概述: 数据对齐指数据在计算机内存中排放和获取的方式.包含三个方面:数据对齐(data alignment).数据结构填充(data alignment).打包(packing) 如果数据是自然对齐的 ...

随机推荐

  1. cocos2d-x博客网站推荐和牛逼的教程

    Cocos2d-x网站列表 CocoaChina(官方网站,不解释)www.cocoachina.com/ 泰然网(貌似最近有很多不错的文章,不过早期的文章质量一般)www.ityran.com/ C ...

  2. Eclipse上运行Python,使用PyDev

    转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-pydev/index.html 级别: 初级 郑 伟芳 (zhengwf@c ...

  3. tomcat开始批量——setclasspath.bat

    除了上述两批,另一个重要的脚本,那是,setclasspath.bat.它主要负责查找.检查JAVA_HOME和JRE_HOME两个变量. ****************************** ...

  4. cfa,cpa,

    CFA考试内容分为三个不同级别,分别是方式是Level I.Level II和Level III. 考试在全球各个地点统一举行,每个考生必须依次完成三个不同级别的考试.CFA资格考试采用全英文,候选人 ...

  5. PCB板蛇形走线有什么作用

    PCB板蛇形走线有什么作用  PCB上的不论什么一条走线在通过高频信号的情况下都会对该信号造成时延时,蛇形走线的主要作用是补偿"同一组相关"信号线中延时较小的部分,这些部分一般是没 ...

  6. java该HashTable,HashMap和HashSet

    同一时候我们也对HashSet和HashMap的核心方法hashcode进行了具体解释,见<探索equals()和hashCode()方法>. 万事俱备,那么以下我们就对基于hash算法的 ...

  7. HibernateReview Day1 - Introduction

    Hibernate已经学过去大概有半个月了,然后默默的忘掉了……所谓Practice makes perfect. 我尽力重新拾起来. 1.什么是ORM 在介绍Hibernate之前,我们先学习下OR ...

  8. Windows Phone开发(44):推送通知第二集——磁贴通知

    原文:Windows Phone开发(44):推送通知第二集--磁贴通知 前面我们说了第一个类型--Toast通知,这玩意儿不知大家是不是觉得很新鲜,以前玩.NET编程应该没接触过吧? 其实这东西绝对 ...

  9. SpringMVC(转)

    http://www.cnblogs.com/liukemng/p/3725582.html

  10. Windows Phone开发(17):URI映射

    原文:Windows Phone开发(17):URI映射 前面在讲述导航的知识,也讲了控件,也讲了资源,样式,模板,相信大家对UI部分的内容应该有了很直观的认识了.那么今天讲什么呢?不知道大家在练习导 ...