C中的结构访问
Posted
技术标签:
【中文标题】C中的结构访问【英文标题】:Struct access in C 【发布时间】:2022-01-18 13:06:45 【问题描述】:这似乎是一个非常愚蠢的问题,但是struct中的成员访问操作是如何执行的呢?
当你写struct_name.member_name
时,机器怎么知道要访问哪个成员?
结构存储在带有一些填充(取决于)的连续内存块中,并且没有任何类型的成员标识符到内存位置的映射 afaik。
与数组不同,不能使用基地址偏移量和大小来访问结构(对吗?)那么它是如何发生的呢?
访问是否需要 O(1)?是什么原因?
【问题讨论】:
编译器根据 C 标准的规则决定成员在struct
中的组织方式。所以它知道每个成员的偏移量是多少。编译器是否使用包含从基址偏移的指令,或者它是否能够计算成员的实际地址,是一个实现细节。
写一个小程序。查看生成的程序集。
搜索包装。一个编译器在特定设置中的打包不能保证与另一个编译器相同......然后了解字节序等,当您将结构指针传递给函数并访问成员时,您相信什么除了以适合成员的偏移量访问内存之外,它还能做什么?
“无法使用基地址偏移量和大小访问结构” - false。
一般来说,机器码中不存在变量和标识符。那里的一切都只是地址。
【参考方案1】:
我不知道您为什么认为标识符和内存位置之间没有映射?访问结构/类的成员只是:实例(结构)的地址+成员的偏移量。所以是的,访问任何成员都是常数时间 O(1)
你可以看到https://en.cppreference.com/w/c/types/offsetof :)
【讨论】:
【参考方案2】:编译器知道结构中每个成员相对于结构开头的位置。因此,给定struct_name.member_name
,它将结构内member_name
的偏移量添加到结构的基地址并访问该地址。
访问是否需要 O(1)
是的。
【讨论】:
@EricPostpischil 我错了 @EricPostpischil GAH!我无法删除已接受的答案...以上是关于C中的结构访问的主要内容,如果未能解决你的问题,请参考以下文章