对于不同的数据类型,内存对齐是否不同

use*_*215 4 c alignment

不要用C不同的数据类型,例如char,short,int,long,float,double有不同的内存边界对齐?在一个32位字对齐的字节可寻址操作系统中,如何访问charshort访问一个int或多个float?在这两种情况下,CPU是否读取完整的32位字?当一个人int不在边界时会发生什么?如何char在任何内存地址读取?

Ter*_*fey 6

正如其他人所指出的那样,简短的答案是编译器会为它编译的架构做最好的事情.它可以将它们与原始单词大小对齐.它可能不会.这是一个展示这一点的示例程序:

#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之间添加了一些填充.它并没有打扰短片.在其他情况下,反之亦然.优化规则很复杂.

并且,警告:编译器比你聪明.除非你有一个非常非常好的理由,否则不要使用填充和对齐.只要相信编译器正在做的事情是正确的.


Sud*_*shu 5

这取决于编译器和您定义变量的方式.大多数编译器的默认行为是将变量对齐,以便在给定平台上实现最快的访问.对齐变量可以为您提供最佳性能.

但是,像gcc这样的编译器提供了编译器特定的指令,可用于"打包"不同类型的相邻变量(以及因此大小),以牺牲性能为代价来节省内存(但这是您可以通过使用来决定的)包装指令.)看到这个问题.

在读取char/short时,CPU可以读取完整的32位字(可能更多以获得整个缓存行).