不要用C不同的数据类型,例如char,short,int,long,float,double有不同的内存边界对齐?在一个32位字对齐的字节可寻址操作系统中,如何访问char或short访问一个int或多个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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
如您所见,它在int和short之间添加了一些填充.它并没有打扰短片.在其他情况下,反之亦然.优化规则很复杂.
并且,警告:编译器比你聪明.除非你有一个非常非常好的理由,否则不要使用填充和对齐.只要相信编译器正在做的事情是正确的.
| 归档时间: |
|
| 查看次数: |
4290 次 |
| 最近记录: |