在C/C++开发中经常会遇到各种数据类型大小和对齐的问题,总结如下。
类型 |
32
位
x86 GNU/Linux
| 64 位 x86 GNU/Linux | ||
大小 | 对齐 | 大小 | 对齐 | |
bool | 1 | 1 | 1 | 1 |
char | 1 | 1 | 1 | 1 |
short int | 2 | 2 | 2 | 2 |
int | 4 | 4 | 4 | 4 |
long int | 4 | 4 | 8 | 8 |
long long int | 8 | 4 | 8 | 8 |
float | 4 | 4 | 4 | 4 |
double | 8 | 4 | 8 | 8 |
long double | 12 | 4 | 16 | 16 |
void* | 4 | 4 | 8 | 8 |
根据以上排列
,
程序员为什么需要更改对齐
?
原因有多个
,但主要原因是在存储器要求与性能之间的取舍。在主机与加速器之间往返发送数据时
,
发射的每个字节都有成本。幸好
,
GCC C/C++
编译器可提供语言扩展 __attribute__ ((aligned(X)))
,
用于为变量、结构
/
类或结构字段更改默认对齐
(
以字节数为单位来测量
)
。例如
,以下声明会导致编译器在
16
字节边界上分配全局变量
x
。
篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……篇幅过短我能怎么办呢,这个知识点本来就不长啊……