2
A
回答
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存储在未对齐的地址上并没有什么区别(除非时间可能很小),编译器可以执行此操作。
相关问题
- 1. 对包含指针的向量排序为结构VS结构
- 2. 对齐SSE的模板向量结构
- 3. 解引用指向结构变量的结构指针
- 4. 指针在C结构体变量
- 5. 结构体数组与指向结构体的指针数组
- 6. 内存对齐结构tbb vs atomic_ops
- 7. 返回指向结构体的指针
- 8. 通过指针指向结构指针来更改变量
- 9. 结构对齐
- 10. 释放指向其他结构的结构体中的指针
- 11. 将指向结构成员变量的(常规)指针转换为指向整个结构的指针
- 12. 指向结构成员变量的指针
- 13. 指向结构tm变量的指针,不能回复更改
- 14. 结构向量中的结构向量
- 15. 指向结构体并投射
- 16. C结构对齐
- 17. 对齐变量
- 18. 返回结构vs pass参考变量
- 19. 指向结构的指针指向结构
- 20. [Visual C++]强制变量/数据结构的内存对齐
- 21. PHP的面向对象的类变量VS对象变量
- 22. 在向量中初始化结构体
- 23. 当初始化SQL DBPROP结构时出现不对齐警告
- 24. 为什么需要一个变量指向一个结构
- 25. 如何使用指针指向结构的向量?
- 26. 如何在结构指向一个指向同一结构
- 27. 如何在指向结构体时正确使用malloc()和realloc()?
- 28. 在结构中访问指针变量
- 29. 声明包含指向该类型结构的指针数组的结构体
- 30. 在其他函数中对结构体和向量部分的向量排序?