gpt4 book ai didi

c - 内存 - 自然地址边界

转载 作者:行者123 更新时间:2023-11-30 15:01:22 31 4
gpt4 key购买 nike

Definition

Structure padding is the process of aligning data members of the structure in accordance with the memory alignment rules specified by the processor.

<小时/>

what is the memory alignment rule for Intel x86 processor?

As per my understanding, natural address boundaries for Intel-x86 processor is 32 bits each(i.e.,addressOffset%4==0)

So, In x86 processor,

struct mystruct_A {
char a;
int b;
char c;

};

will be constructed as,

struct mystruct_A {
char a;
char gap_0[3]; /* inserted by compiler: for alignment of b using array */
int b;
char c;
char gap_1[3]; /* for alignment of the whole struct using array */
};

what is the memory alignment rule for Intel x86-64 processor?

As per my understanding, natural address boundaries for Intel x86-64 processor is 64 bits each(i.e.,addressOffset%8==0)

So, In x86-64 processor,

struct mystruct_A {
char a;
int b;
char c;

};

will be constructed as,

struct mystruct_A {
char a;
char gap_0[7]; /* inserted by compiler: for alignment of b using array */
int b;
char c;
char gap_1[7]; /* for alignment of the whole struct using array */
};
<小时/>

如果上面的理解是正确的,那么我想知道为什么要用int数组来进行位运算

建议使用 int 大小的数据,如前所述 here ,这就是说,因为对内存的最具成本效益的访问是访问 int 大小的数据

问题:

这个内存对齐规则是否强制为位操作声明 int 大小的数据?

最佳答案

附录:这适用于 x86/-64 位处理器,也适用于其他处理器。我盲目地假设你正在使用这些。对于其他人,您应该查看相应的手册。

<小时/>

如果 fasm 自动将填充物添加到我的结构中,我会发疯的。一般来说,当对内存的访问位于与要检索的元素的大小相对应的边界上时,性能会更好。话虽这么说,但这并不是绝对必要的!

这里的这篇文章可能值得一看:https://software.intel.com/en-us/articles/coding-for-performance-data-alignment-and-structures

英特尔对最佳布局的建议是首先从最大的元素开始,然后随着结构的增加而减小。这样,只要第一个元素正确对齐,您就可以保持正确对齐。没有三字节元素,因此不存在未对齐的问题,编译器可能做的就是在末尾添加字节,这是确保如果您选择直接内存访问不会破坏事物的最佳方法而不是使用变量。

最安全的过程是不要依赖编译器,而是自己正确对齐数据。

有趣的事实:循环的工作方式相同。在循环开始之前在代码中填充 NOP 可能会产生影响。

关于c - 内存 - 自然地址边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41461431/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com