![]() |
1
2
|
![]() |
2
1
我认为这可能是因为地址与边界对齐(例如8字节边界)?。 分配始终与边界对齐,并按块分配 在某些操作系统中。您可以使用结构进行检查。例如 结构A { 字符a; 字符b; 整数c; }; 在UNIX/LINUX平台上,结构的大小不会是6字节。 但它可能因操作系统而异。 类似的情况也适用于其他数据类型。 此外,字符串只指向在 堆,如果使用malloc,分配逻辑可能会有所不同 从操作系统到操作系统。以下是Linux框的输出 对于同一个程序。 x的值为10 x的地址为0x7ffffa43a50c x的去引用地址给出10 y的值为20 y的地址是0x7ffffa43a508 y的去引用地址给出20 str的值为abcd str的地址为0x7ffffa43a500 str的取消引用地址给出abcd z值为30 z的地址为0x7ffffa43a4fc z的去引用地址给出30 |
![]() |
3
1
@ameyCU和@Umamahesh的回答都很好,但没有一个是自给自足的,所以我正在写我的答案,并添加更多信息,以便进一步访问的人能够获得最大的知识。 我之所以得到这个结果,是因为这个概念叫做 Data structure alignment 因此,计算机将始终尝试分配内存( 无论是在堆段、堆栈段还是数据段,在我的例子中都是堆栈段 )以一种能够快速读写的方式分块。 当现代计算机读取或写入内存地址时,它将以字大小的块(例如,32位系统上的4字节块)或更大的块来执行此操作。数据对齐意味着将数据放在一个等于字大小的几倍的内存地址,这会由于CPU处理内存的方式而提高系统的性能。 在32位体系结构中,计算机的字长是4字节,所以计算机总是试图分配地址为4的倍数的内存,这样它就可以快速地在4字节的块中读写。当字节数较少时,计算机会在开始或结束时填充一些空字节。
在我的情况下,假设我使用
自从
经验法则
如果你的内存需求不是4的倍数(例如1
以下是摘自 this answer 这解释了数据结构对齐。 假设你有这个结构。
如果没有对齐,它将像这样在内存中布局(假设32位架构):
问题是,在某些CPU架构上,从内存加载4字节整数的指令只在字边界上工作。因此,您的程序必须使用单独的指令获取b的每一半。 但如果记忆被安排为:
然后访问b变得简单。(缺点是由于填充字节,需要更多的内存。) |
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 4 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 5 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 5 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 5 月前 |