【发布时间】:2022-01-18 13:06:45
【问题描述】:
这似乎是一个非常愚蠢的问题,但是struct中的成员访问操作是如何执行的呢?
当你写struct_name.member_name时,机器怎么知道要访问哪个成员?
结构存储在带有一些填充(取决于)的连续内存块中,并且没有任何类型的成员标识符到内存位置的映射 afaik。
与数组不同,不能使用基地址偏移量和大小来访问结构(对吗?)那么它是如何发生的呢?
访问是否需要 O(1)?是什么原因?
【问题讨论】:
-
编译器根据 C 标准的规则决定成员在
struct中的组织方式。所以它知道每个成员的偏移量是多少。编译器是否使用包含从基址偏移的指令,或者它是否能够计算成员的实际地址,是一个实现细节。 -
写一个小程序。查看生成的程序集。
-
搜索包装。一个编译器在特定设置中的打包不能保证与另一个编译器相同......然后了解字节序等,当您将结构指针传递给函数并访问成员时,您相信什么除了以适合成员的偏移量访问内存之外,它还能做什么?
-
“无法使用基地址偏移量和大小访问结构” - false。
-
一般来说,机器码中不存在变量和标识符。那里的一切都只是地址。
标签: c struct memory-alignment