指定字节对齐方式

今天看到内存字节对齐的东西,就认真的看了起来,一点睡意都没有了。

对于内存字节对齐

#pragma pack(push,n)

表示一下结构或类成员以n字节方式对齐,注意并不是每个成员都是占用n个字节,而是取min(成员类型,n)。记住这一点就不怕再算错了。

#pragma pack()

表示内存字节对齐方式到此结束。

下面写写几个例子:

struct A{
    int a;
    char b;
    short c;
}

结构体A占用的字节数计算方法如下:int =4,存放在[0]~[3] char 存放在[4],short占两个字节,所以char后面空一个字符,short放在[6]~[7] 共占用8个字节的内存。sizeof(A)=8.

struct B{
    char b;
    int a;
    short c;
}

结构体B占用的字节数计算方法如下:char =1,存放在[0], int=4,所以char后面要空出来3个字节,然后在存放int类型,即存放在[4]~[7],short占两个字节,所以结构体共占十个字节,但是10不是最大类型(占4个字节)的整数倍10/4,距离10最近的整数倍是12,所以sizeof(B)=12. 

下面来看一下指定字节对齐的计算方式

#pragma pack(push,4)
struct A{
    int a;
    char b;
    short c;
}
#pragma pack()

一定要记住min(成员类型,n),使用公式可以计算得到int =4,char=1(但是后面的short比char大,所以一后面的为准。char=1然后空出1个字节,后面再放short)short=2。所以sizeof(A)=8。

#pragma pack(push,4)
struct B{
    char b;
    int a;
    short c;
}
#pragma pack()

按照上面的计算方法得出sizeof(B)= 12。

#pragma pack(push,2)
struct A{
    int a;
    char b;
    short c;
}
#pragma pack()

按照上面的计算方法得出sizeof(B)= 8。

总结:<1>公式min(成员类型,n)

    <2>看下一个成员类型是否比自己少,没有的话按照下一个计算。

时间: 2024-10-07 03:19:26

指定字节对齐方式的相关文章

字节对齐问题

文章最后本人做了一幅图,一看就明白了,这个问题网上讲的不少,但是都没有把问题说透. 32位机器上各种数据类型的长度如下:char:1(有符号无符号同) short:2(有符号无符号同) int:4(有符号无符号同) long:4(有符号无符号同) float:4 double:8 一.概念    对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐.比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的.   二.为什么要

C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)

转载地址 : http://blog.csdn.net/21aspnet/article/details/6729724 一.概念    对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐.比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的.   二.为什么要字节对齐   需要字节对齐的根本原因在于CPU访问数据的效率问题.假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访

c++内存中字节对齐问题详解

一.介绍 什么是字节对齐 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 字节对齐的原因和作用 各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字

C++中的字节对齐

本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一.小鱼)相关研究.学习内容所做的笔记,欢迎广大朋友指正! 字节对齐 1. 基本概念字节对齐:计算机存储系统中以Byte为单位存储数据,不同数据类型所占的空间不同,如:整型(int)数据占4个字节,字符型(char)数据占一个字节,短整型(short)数据占两个字节,等等.计算机为了高速的读写数据,默认情况下将数据存放在某个地址的起始位置,如:整型数据(int)默认存储在地址能被4整除的起始位置,字

字节对齐导致的iOS EXC_ARM_DA_ALIGN崩溃

本文原链接: http://www.cnblogs.com/zouzf/p/4455167.html 先看一下这个链接:http://www.cnblogs.com/ren54/archive/2013/01/11/2856207.html 我遇到情况和这位朋友很类似:用二进制方式从文件读取内容到内存,假设内容只有7个字节,前面三个字节是三个字符,后四个字节的内容是一个int数据,在把后四个字节转成int数据时如(pFileContent是char*指针,已指向第四个字节):int intVal

字节序与字节对齐

一.网络字节序与主机字节序 1.大端和小端存储大端(Big Endian):高位存低地址.符合人类的正常思维.网络字节序采用大端(网络传输的是字节流). 小端(Littile Endian):低位存低地址. 如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示.---------------------------地址偏移 大端模式 小端模式0x00      12     780x01      34     560

字节对齐2

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节指低字节数据存放在内存低地址处,高字节数据存放在内存的高地址处:大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处.基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的.因而对int.uint16.uint32等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺序.通常我们认为,在网络中传输的字节的顺序即网络字节序为标准顺序,考虑到与协议的一致以及与同类其他平台产

字节对齐1

一.快速理解1.什么是字节对齐?    在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int.long.float等)的变量,也可以是一些复合数据类型(如数组.结构.联合等)的数据单元.在结构中,编译器为结构中的每个成员按其自然边界(alignment)分配空间.各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同.    为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的“对齐”,比如4字节的int型,其起始地址

&lt;转&gt; Struct 和 Union区别 以及 对内存对齐方式的说明

转载地址:http://blog.csdn.net/firefly_2002/article/details/7954458 一.Struct 和 Union有下列区别: 1.在存储多个成员信息时,编译器会自动给struct第个成员分配存储空间,struct 可以存储多个成员信息,而Union每个成员会用同一个存储空间,只能存储最后一个成员的信息. 2.都是由多个不同的数据类型成员组成,但在任何同一时刻,Union只存放了一个被先选中的成员,而结构体的所有成员都存在. 3.对于Union的不同成