所以我看到,当变量在c++中声明时,如果您想获得最佳的缓存读取,那么内存应该坚持它的自然对齐。示例:
int a; // memory address should end in 0x0,0x4,0x8,0xC
int b[2]; // 8 bytes 0x0,0x8
int b[4]; // 16 bytes 0x0
但在实践中,这些变量并不遵循“自然对齐”规则,一个16字节变量驻留在以0xC结尾的内存地址中。这是为什么?
我的问题是在C中的程序之间发送一个结构到一个C#程序。
我在C#中创建了一个结构:
public struct NetPoint {
public float lat; // 4 bytes
public float lon; // 4 bytes
public int alt; // 4 bytes
public long time; // 8 bytes
}
结构的总大小必须是20个字节。
当我在这个结构的sizeof()中做C++时,
System.Diagnostics.Debug.WriteLine(
"SizeOf(NetPoint)
我知道内存寻址可以用字大小的倍数来完成,所以对于Intel 32位,在程序集中的堆栈上分配内存可以用
//pseudo code
sub , esp ,4 // so for allocating for a integer on stack
sub esp, 8 // for a buffer of size 5 for example b[5]
因此,寻址是以4的倍数完成的。因此,也引用了堆栈上的局部变量和参数。
// referring to variable --ebp-4
但有时在拆卸过程中,我会看到一些说明,如
movb $0x41
我试图理解为什么结构填充是memcmp不能比较结构的原因。关于结构填充,我不理解的一件小事是……为什么“a short be 2 byte aligned"或"a long be 4 byte aligned"。我理解这是因为它们的大小,但为什么它们不能出现在任何字节边界?
或者换句话说"why is 0x10004566 not a valid location for a long variable but 0x10004568 is?"