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中的结构访问的主要内容,如果未能解决你的问题,请参考以下文章

无法访问返回的结构中的指针值 [C]

C - 将结构值中的变量名作为字符串访问

如何在C#/ Unity中访问预定义结构化对象中的其他元素?

C++中类和结构体的区别

我可以用吗 。作为gnu c结构中的成员限定符[关闭]

访问/分配列表中结构中的值的问题 - C++