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. C#如何在钉钉开发平台

    C#如何在钉钉开发平台中创建部门   钉钉是阿里巴巴专为中小企业和团队打造的沟通.协同的多端平台,钉钉开放平台旨在为企业提供更为丰富的办公协同解决方案.通过钉钉开放平台,企业或第三方合作伙伴可以帮助企 ...

  2. 京东商城招聘scala 高级开发工程师 T3级别

    岗位级别:T3 岗位职责: 1.参与自动调价.匹配系统的设计和实现 岗位要求: 1. 一年以上scala开发经验2.良好的函数式编程能力3. JAVA基础扎实4.熟悉大数据处理,有hadoop/hba ...

  3. hdu1159 LCS模板题

    题目分析 pid=1159">原题地址 最简单的最长公共子序列(LCS)问题的模板题了.不解释. ------------------------------------------- ...

  4. Java调用cmd压缩文件

    今天在做一个java调用windows的压缩命令时遇到一奇怪问题代码如下: String cmd ="C:/Program Files (x86)/WinRAR/rar.exe a c:/t ...

  5. 3DMax的OFusion插件使用问题

    使用OFusion将3D max场景导出为Ogre的Mesh是非经常常使用的方法.这里汇总一些问题方便查阅. 1.OFusion获取: http://download.csdn.net/detail/ ...

  6. cocos2d-x3.0 实现HTTP请求GET、POST

    HTTP请求实现 把以下代码拷贝到新创建的project中就能看到效果 HelloWorldScene.h #include "cocos2d.h" /*记得要引头文件*/ #in ...

  7. Screwturn搭建企业内部wiki

    企业内部WIKI搭建 本文所使用的是Screwturn 基于asp.net webform和Sql server的. 仅仅要把本文资源下载下来,直接用IIS部署,然后更改web.config的conn ...

  8. ASP.NET Core环境并运行 继续跨平台

    ASP.NET Core环境并运行 继续跨平台 无需安装mono,在Linux(Ubuntu)下搭建ASP.NET Core环境 继续.NET跨平台 上一篇:使用VS Code开发ASP.NET Co ...

  9. Android开发之文件下载,状态时显示下载进度,点击自动安装

    在进行软件升级时,需要进行文件下载,在这里实现自定义的文件下载,并在状态栏显示下载进度,下载完成后,点击触发安装. 效果如图: 用于下载文件和显示现在进度的线程类如下: [java]  view pl ...

  10. leetCode Min Stack解决共享

    原标题:https://oj.leetcode.com/problems/min-stack/ Design a stack that supports push, pop, top, and ret ...