首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言字节对齐问题分析1

作者:李云 摘要 字节对齐(alignment)是CPU在性能方面所面临的一个非常重要的问题。...有些处理器能自动处理不对齐数据的访问(对字节对齐要求不严格),但是,有些处理器却无法处理(对字节对齐要求很严格)。...对于c程序员,大部分情况下我们并不考虑字节对齐问题,这并不是说我们并不需要考虑,而是因为碰到这种问题的情况很少。一方面要在特定的处理器上,而另一方面和我们写的程序也有关系。...因此,结果给我们的感觉是”字节对齐与我无关”。 本文通过一小段代码通过在不同处理器上的运行结果引出对字节对齐问题的关注,同时进行原因分析。 1....这其实是一个cpu对齐所引发的问题,下面我们通过对字节对齐问题的分析来探究其背后的原理。后面的分析我们全部针对运行在32位SPARC处理器上的Solaris操作系统进行的。

1.3K10
您找到你想要的搜索结果了吗?
是的
没有找到

c语言结构体字节对齐详解

1.什么是字节对齐c语言的结构体里面一般会按照某种规则去进行字节对齐。...//64位下 sizeof(struct st1) = 24 struct st2 { char a; char b; char c; }; //32位和64位下, sizeof...(struct st2)都是3个字节 从以上结果可以看出,结构体st1在32位下是按照4个字节对齐的,在64位下则是按照8个字节对齐的,结构体st2则不管32位还是64位则都是按照1字节对齐的。...定义结构体时: //用法如下 struct bbb { char a; int b; }__attribute__((packed));//直接按照实际占用字节对齐,其实就是相当于按照1字节对齐了...//这里计算sizeof(st3)=5 4.结构体比较方法 可以使用内存比较函数memcpy进行结构体比较,但因为结构体对齐可能会有填充位不一致的情况,此时需要注意: 设置为1字节对齐,使它没有空位

2.3K10

C语言字节对齐问题分析2

因此,我们写的c程序为了获得更高的运行效率就必须最大限度的满足cpu对于字节对齐的要求,编译器在其中起着至关重要的作用。...下面的c程序在编译后运行,在终端将会打出”size of type_t is 8”。为什么是8而不是5呢?这是因为编译器考虑到了运行效率,从而将type_t做了4字节对齐的处理。...2字节对齐。...回到图1,先看看采用字节对齐时的情况,从图中可以看出,当cpu需要分别访问a变量和b变量时,无论如何都只需要分别进行一次内存存取,图中的花括号表示一次 内存存取操作。...此外,更为麻烦的是对于边界不对齐的b,还得将其合成4字节(一部分是来自一个四字节中的b0、b1和b2,另一部分来自另一个4字节中的b3),而这又增加了程序的复杂性,即需要更多的指令来完成。

1.5K20

C语言结构体字节对齐 | 结构体与联合

结构体字节对齐 结构体的空间大小: 结构体为了保证CPU的访问效率,默认采用内存对齐机制 对齐标准为结构体中基础数据类型的成员最大值 对齐标准和成员申明顺序有关 #include #...通过上图我发现结构体的存储不是简单的字节的累加:4+16 = 20;4+15 = 20; 2.为什么要使用字节对齐规则呢?...,提出了一个概念:字节对齐。...(2)从第二个成员开始,在其自身对齐数的整数倍开始存储(对齐数=编译器默认对齐数和成员字节大小的最小值,VS编译器默认对齐数为8)。 (3)结构体变量所用总空间大小是成员中最大对齐数的整数倍。...,由规则(1)可得如下; 橙色填充为结构体成员b,因其为int类型(4个字节)且不是第一个成员,由规则(2)可得如下; 绿色填充为结构体成员c,因其为char类型且不是第一个成员,由规则(2)(3)可得如下

2.2K10

字节对齐

设结构体如下定义: struct A { int a; char b; short c; }; 结构体A中包含了4字节长度的int一个,1字节长度的char一个和2字节长度的...修改对齐值为1: #progma pack (1) /*指定按1字节对齐*/ struct D { char b; int a; short c; }; #progma...又C的自身对齐值为4,所以 C的有效对齐值为2。又8%2=0,C只占用0x0000到0x0007的八个字节。所以sizeof(struct C)=8....这里主要看结果中struct s1和struct s2结构体的大小及struct s2中成员c的地址,可以得出一下结论(gcc版本4.1): 1 Linux 64位系统下gcc编译器默认对齐为8字节...2 Linux32位系统下gcc编译器默认对齐为4字节 3 在64位系统#pragma pack(4)的情况下,a1->c的地址按4字节对齐而不是按8字节(long在64位下为8字节长),会不会影响

2.1K50

C语言 | C++内存对齐

C语言允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再模糊了。...(或联合)最大数据成员长度中,比较小的那个进行; //2020.05.12 公众号:C语言与CPP编程 #include struct { int i; char c1...; char c2; }Test1; struct{ char c1; int i; char c2; }Test2; struct{ char c1;...,所以有效对齐单位为4字节,下面根据上面所说的规则以第二个结构体来分析其内存布局:首先使用规则1,对成员变量进行对齐: sizeof(c1) = 1 <= 4(有效对齐位),按照1字节对齐,占用第0单元...因此整体也是按照4字节对齐。由规则1得到s2占9个字节,此处再按照规则2进行整体的4字节对齐,所以整个结构体占用12个字节

3.4K89

结构体字节对齐

对齐参数为4,接下来的地址相对于结构体的起始地址的偏移量为11不能够整除4,所以需要在a后面填充3字节使得偏移量达到4,然后再为b分配4字节的空间;   对于变量c,它的自身对齐参数为2,#pragma...pack(n)默认值为8,则最终c对齐参数为2,而接下来的地址相对于结构体的起始地址的偏移量为8,能整除2,所以直接为c分配2字节的空间。   ...此时结构体所占的字节数为1+3+4+2=10字节   最后由于a,b,c的最终对齐参数分别为1,4,2,最大为4,#pragma pack(n)的默认值为8,则结构体变量最后的大小必须能被4整除。...整除,所以需要在s1后面填充4字节达到16,再为b分配8字节的空间;   对于变量c,它的自身对齐参数为4,#pragma pack(n)的默认值为8,则c的最终对齐参数为4,接下来相对于结构体其实地址的偏移量为...出这类题并不在于考查理解语言本身和编译器,而在于应聘者对计算机底层机制的理解和设计程序的原则。也就是说,如果让你设计编译器,你将怎样解决内存对齐的为问题。

1.2K60

CC++字节对齐

比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失...例子 例子1 typedef struct node1 { int a; char b; short c; }S1; 则sizeof(S1)=8。...例子4 若在程序中使用了#pragma pack(n)命令强制以n字节对齐时,默认情况下n为8. 则比较n和结构体中最长数据类型所占的字节大小,取两者中小的一个作为对齐标准。...S1 s1; double b; int c; }S5; 则sizeof(S5)=24.因为强制以4字节对齐,而S5中最长数据类型为double,占8字节,因此以4字节对齐。...在内存中存放方式为: |-----------a--------| 4字节 |--------s1----------| 4字节 |--------s1----------| 4

36030

结构体字节对齐

b; short c; }S2;  sizeof(S2)=12;   对于变量a,它的自身对齐参数为1,#pragma pack(n)默认值为8,则最终a的对齐参数为1,为其分配1字节的空间,...1不能够整除4,所以需要在a后面填充3字节使得偏移量达到4,然后再为b分配4字节的空间;   对于变量c,它的自身对齐参数为2,#pragma pack(n)默认值为8,则最终c对齐参数为2,而接下来的地址相对于结构体的起始地址的偏移量为...此时结构体所占的字节数为1+3+4+2=10字节   最后由于a,b,c的最终对齐参数分别为1,4,2,最大为4,#pragma pack(n)的默认值为8,则结构体变量最后的大小必须能被4整除。...对于变量a,其自身对齐参数为1,#pragma pack(n)为8,则a的最终对齐参数为1,为它分配1字节的空间,它相对于结构体起始地址的偏移量为0,能被1整除;   对于s1,它的自身对齐参数为4(对于结构体变量...,所以需要在s1后面填充4字节达到16,再为b分配8字节的空间;   对于变量c,它的自身对齐参数为4,#pragma pack(n)的默认值为8,则c的最终对齐参数为4,接下来相对于结构体其实地址的偏移量为

1.6K50

C语言:--位域和内存对齐

这节写点什么,就写位域和内存对齐吧。 位域 位域是指信息在保存时,并不需要占用一个完整的字节,而只需要占几个或一个二进制位。为了节省空间,C语言提供了一种数据结构,叫“位域”或“位段”。...1. 在C中,位域可以写成这样(注:位域的数据类型一律用无符号的,纪律性)。...内存对齐: ---- 1....必须4字节对齐,对于double,必须8字节对齐),这很大程度上提高了储存器和CPU的工作性能,但是对存储空间的浪费比较严重;对于Linux,惯例是8字节对齐4字节边界(比如double可以4字节对齐...: struct X {   char a; // 1 bytes   char padding1[3]; // 3 bytes   float b; // 4 bytes   int c; // 4

2.7K30

C语言笔记】结构体内存对齐

先看一个结构体: typedef struct Test { char a1; int a2; char a3; short a4; }Test_T; 在32位编译系统下这一个结构体的字节数是多少呢...是1+4+1+2=8字节吗?不是的,实际结果为12字节。为什么呢?因为编译器会对不足4字节的变量空间自动补齐为4个字节(这就是内存对齐),以提高CPU的寻址效率(32位CPU以4个字节步长寻址的)。...对于32bit的CPU,其寻址的步长为4个字节(即unsigned int 字节长度),这就是常说的“4字节对齐”。同理,对于64bit的CPU,就有“8字节对齐”。本文以32位的CPU为例。...可见,正好印证了上述的说法,补齐之后结构体成员a1,a2,a3的地址之间正好相差4个字节,a3与a4之间相差两个字节也是因为在其中多留出了1个空白字节。该程序的运行结果可形象地描述为下图: ?...a1只占用一个字节,为了内存对齐保留了三个空白字节;a3和a4加起来共3字节,为了内存对齐保留了1个空白字节。这就是编译器存储变量时做的见不得人的”手脚“,以方便其雇主——CPU能更快地找到这些变量。

63120

字节对齐,看这篇就懂了

有读者对字节对齐还有些疑问,这里分享一篇旧文。 字节对齐是我们初学C语言就会接触到的一个概念,但是到底什么是字节对齐对齐准则又是什么?为什么要字节对齐呢?字节对齐对我们编程有什么启示?...),可以看到,结构体test 的大小为16字节,而不是11字节(a占4字节,b占1字节c占4字节,d占2字节) #64位机器上编译32位程序可能需要安装一个库 #sudo apt-get install...1字节对齐 自己对结构进行字节填充 我们可以使用伪指令#pragma pack(n)(n为字节对齐数)来使得结构间一字节对齐。...当然了对于单个结构体,如下的方法,使其1字节对齐 struct test { int a; char b; int c; short d; }__attribute__...c; short d; char reserve1[2]; }; 访问效率高,但并不节省空间,同时扩展性不是很好,例如,当字节对齐有变化时,需要填充的字节数可能就会发生变化。

22K44

C语言笔记---(1)初识C语言

C语言简介 C语言的历史 1972年,贝尔实验室,1972年,丹尼斯·里奇和布莱恩·柯林汉(Brian Kernighan)在B语言的基础上重新设计了一种新语言,这种新语言取代了B语言,所以称为C语言...C语言的源代码可以在任意架构的处理器上使用。 C语言的特点 1.语言简洁灵活 C语言是现有程序设计语言中规模最小的语言之一,C语言的关键字仅仅只有32个,控制语句也只有9个。...C语言是完全模块化和结构化的语言C语言对于输入和输出的处理也是通过函数调用来实现的。...这本书被C语言开发者们称为“K&R”,很多年来被当作C语言的非正式的标准说明。人们称这个版本的C语言为“K&R C”。...应用范围: 1.编译器,JVM,驱动 2.操作系统内核 3.各类软件开发 4.嵌入式设备开发,例:手机 5.等等等 C语言的编译 C语言是一种编译型语言,源码都是文本文件,本身无法执行。

23.6K11

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券