在C中执行不同的数据类型,例如char
, short
, int
, long
, float
, double
有不同的内存对齐边界吗?在 32 位字对齐字节可寻址操作系统中,如何访问char
or short
与访问不同int
or float
?在这两种情况下,CPU 是否读取完整的 32 位字?当一个int
不是在边界吗?它如何能够读取char
在任何内存地址?
正如其他人指出的那样,简短的答案是编译器将采取最适合其编译目标的体系结构的方式。它可以将它们与本地字大小对齐。可能不会。这是一个演示这一点的示例程序:
#include <iostream>
int main()
{
using namespace std;
char c;
short s;
int i;
cout << "sizeof(char): " << sizeof(char) << endl;
cout << "sizeof(short): " << sizeof(short) << endl;
cout << "sizeof(int): " << sizeof(int) << endl;
cout << "short is " << (int)&s - (int)&c << " bytes away from a char" << endl;
cout << "int is " << (int)&i - (int)&s << " bytes away from a short" << endl;
}
输出:
sizeof(char): 1
sizeof(short): 2
sizeof(int): 4
short is 1 bytes away from a char
int is 4 bytes away from a short
正如您所看到的,它在 int 和 Short 之间添加了一些填充。它并没有因为短路而烦恼。在其他情况下,情况可能恰恰相反。优化规则很复杂。
并且,警告:编译器比你聪明。除非你有非常非常充分的理由,否则不要使用填充和对齐方式。只要相信编译器正在做的事情是正确的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)