今天有时间对alignment重新学习了一下,发现自己之前对alignment的理解是片面的。
alignment理解
alignment的含义可以分为两部分:
1.数据对齐,即这个对象的地址是多少的倍数。
int *p = (int *)malloc(sizeof(int));
在32位机种这段代码中p的值就为8的倍数,因为malloc返回的值需要满足系统中所有的基本数据类型的对齐要求。
2.结构的数据填充。
typedef struct {
char c;
short sh;
int word;
}
在默认alignment下这个结构中在c后面就会填充一个字节。因为short的alignment是2,所以会填充一个空字节,来达到short的alignment要求。
各种基础类型的alignment
char为1,short为2,int为4,long为4,long long为8。结构的
alignment 为其所有元素的alignment的最大值。
#pragma pack(n)的理解
如果在程序中指定pack那么是不是所有元素的alignment就为n了呢?
答案是否定的。
在制定了pack(n)的时候,编译器确定alignment的方法是系统默认alignment和指定alignment的最小值,比如char的alignment仍为1,short的alignment为min(2,n)。
另外pack这条语句对malloc并没有任何影响,malloc返回值仍是满足系统中所有基本数据类型的对齐要求。那如果你需要malloc返回的地址有更大的alignment怎么办呢?
使用memalign。具体可以参考http://www.kernel.org/doc/man-pages/online/pages/man3/posix_memalign.3.html
分享到:
相关推荐
本篇文章将详细探讨如何使用`print`函数来实现中央对齐、填充和对齐标识符。 在Python中,我们可以使用`format`方法进行复杂的字符串格式化。对于中央对齐,我们可以利用`format`方法中的宽度指定器和对齐标志。...
"实现文章字符串对齐方式"这个主题涉及到的是如何编程地控制文本在页面上的布局,使其按照左对齐、右对齐或居中的方式进行排列。在本文中,我们将深入探讨这些对齐方式的原理以及在实际开发中如何实现它们。 首先,...
### VS C++ 字节对齐方式详解 ...在实际开发过程中,程序员需要根据具体情况选择合适的字节对齐策略,并通过适当的方法(如使用预处理器指令)来控制结构体的对齐方式,以确保程序的高效和稳定运行。
我们可以通过调用`setHorizontalAlignment`和`setVerticalAlignment`方法来设置单元格的水平和垂直对齐方式,分别有左对齐、居中、右对齐、靠上、居中、靠下等选项。文本旋转是通过`setRotation`方法完成的,参数...
在“格式”菜单中,可以进一步设置前导符样式,以及调整制表位的对齐方式和填充字符。输入目录内容时,按Tab键,Word会自动填充前导符,这样用户就可以自由地添加或修改目录项,实现完全个性化的目录设计。这样的...
控制输出格式是指程序员可以控制输出的宽度、对齐方式和填充字符。 1. 控制输出宽度:可以通过在流中放入setw操纵符或调用width成员函数为每个项指定输出宽度。 2. 控制输出对齐方式:可以通过在流中放入setf操纵...
在`%`操作符前添加符号可以控制对齐方式和填充字符。`0`表示用0填充,`-`表示左对齐,空格表示在正数前填充空格。例如: ```python '%010.2f' % pi # 输出 '0000003.14' '%-10.2f' % pi # 输出 '3.14' '% 5d' %...
5. **对齐和填充**:在占位符中可以指定对齐方式和填充字符。例如,`{0,8}`表示向右对齐,总宽度8,空缺部分用空格填充;`{0,-8}`表示向左对齐,同样总宽度8。 6. **参数数组**:如果占位符数量多于传递的参数,...
GridBagLayout是最灵活的布局管理器,允许组件在网格中占据不规则的空间,可以设置每个组件的权重、对齐方式和填充等属性,但使用起来相对复杂。 6. **BoxLayout** BoxLayout沿X轴或Y轴按顺序排列组件,支持组件...
可以创建一个通用的方法,接受字符串、目标长度和对齐方式(左、右、居中)作为参数,然后返回对齐后的字符串。 在提供的文件列表中,`StringDemo_25.java`可能包含了具体的字符串对齐实现代码,而`Java.jpg`可能是...
C语言中的数据存储对齐是编译器为了提高内存访问效率和硬件兼容性而采用的一种策略。它涉及到如何在内存中安排数据结构的各个成员,确保数据读取和写入时能够快速高效地进行。对齐规则主要有以下几点: 1. **成员按...
2. 将各数据成员为了内存对齐,按各自对齐模数而填充的字节数累加到和 sum_a 上,记为 sum_b。 3. 将和 sum_b 向结构体模数对齐,该模数是#pragma pack 指定的数值和结构体内部最大基本数据类型成员长度中数值较小者...
例如,`#pragma pack(1)`会改变默认的对齐参数为1,这会使得结构体成员之间的填充字节被去除,从而使sizeof(A)和sizeof(B)的值均为6。 此外,当一个结构体中没有任何成员,即为空结构体时,不同编译器可能会有不同...
"底部自动填充对齐jquery瀑布流"是利用jQuery实现的一种特殊的网页布局方式,通常用于图片展示或者商品陈列等场景,能够使页面元素如同瀑布般自上而下、逐列填充,形成美观的视觉效果。 瀑布流布局,也被称为...
通过这种方式,可以控制内存的使用,或者在需要兼容某些硬件平台时,保证数据以正确的方式对齐。 编译器进行对齐的基本原则包括以下几点: 1. 数据类型自身的对齐值:这指的是该类型数据在内存中对齐的字节数。 2. ...
例如,一个结构体`struct stu`包括一个字符、一个整型和一个字符数组,如果在默认的4字节对齐环境下,编译器会在`sex`和`length`之间填充3个字节,以及在`name`后面填充两个字节,使得整个结构体大小为20字节,而...
2. **硬件限制**:对于某些处理器架构而言,如果数据没有按照特定的方式对齐,可能会导致处理器无法正常工作,或者触发异常(如未对齐访问异常),从而影响程序的稳定性。 #### 三、编译器对内存对齐的处理 不同的...
这是因为结构体需要按照4字节对齐,因此最后会填充一个字节以达到8字节的边界。 总结来说,内存字节对齐是一个关于数据存储的重要概念,它涉及到编译器的内部机制、硬件平台的特性和性能优化。理解和掌握对齐规则...
- `__attribute__((packed))`可以用于单个结构体声明,强制结构体不进行额外的对齐填充。 4. **性能影响** - 对齐可以提高CPU访问内存的速度,特别是对于现代处理器,对齐可以避免因访问非对齐地址而产生的异常或...