2017-02-20 49 views
2

当我们谈论对齐时,我们总是指向结构体内的变量而不是单个变量。当指向结构体vs变量时对齐

请问能告诉我为什么? 当我们指的是一个变量时,它会占用整个“单词”的大小吗?

回答

0

最有可能的,因为如果你与你无论是在低级别的优化世界(基于高速缓存行估计和诸如此类的东西)可变alignement搞乱或做一些嵌入节目。

大多数开发人员不这样做,那些做的人更有可能去阅读他们的plateforme规范,并重新思考他们可能已经知道的对齐原则,而不是在互联网上讨论它(当然也有例外,它是只是不是一般的倾向)。

我还没有看到一个变量alignement这是不是一个衍生物:

// the array "cacheline" will be aligned to 128-byte boundary 
alignas(128) char cacheline[128]; 

在另一方面,你并不需要非常具体的情况看骨料(结构)的影响对一个程序进行调整。

这东西初学者会写和问题,在某些时候或其他:

#include <iostream> 

struct no_align 
{ 
    char c; 
    double d; 
    int i; 
}; 

struct align 
{ 
    double d; 
    int i; 
    char c; 
}; 

int  main(void) 
{ 
    no_align  no_align_array[100]; 
    align   align_array[100]; 

    std::cout << sizeof(no_align_array) << std::endl; 
    std::cout << sizeof(align_array) << std::endl; 
} 

在我的机器,结果是:

2400 
1600 

而这正是你会去周围的点在互联网上询问为什么在世界上,如果没有老师向你解释过,那么一个版本会使你使用800以上的字节数。

0

每个类型具有一个尺寸,这是固定的,和一个对齐要求。

一个结构有自己的对齐要求成员。作为一个合乎逻辑的结果,结构必须具有至少与所有成员一致的对齐要求。结构可能需要添加填充以便其所有成员满足其对齐要求。

阵列连续地存储多个阵列元件而没有任何填充。作为一个逻辑结果,任何类型的大小都必须是其对齐要求的倍数(因此,包含int和char的结构不能具有四个字节的对齐要求和五个字节的大小,因为这不适用于在两个这样的结构的阵列中的第二数组元素)。

变量需要有地址,以便其对准的要求得到满足,那么你的第一句话是错误的。

然而,有“为假设”规则:通常,编译器必须做什么语言告诉它。但“假设”规则说,只要程序找不到差异,编译器就可以做任何想做的事情。因此,如果将一个int存储在未对齐的地址上并没有什么区别(除非时间可能很小),编译器可以执行此操作。