【问题标题】:Struct access in CC中的结构访问
【发布时间】:2022-01-18 13:06:45
【问题描述】:

这似乎是一个非常愚蠢的问题,但是struct中的成员访问操作是如何执行的呢?

当你写struct_name.member_name时,机器怎么知道要访问哪个成员? 结构存储在带有一些填充(取决于)的连续内存块中,并且没有任何类型的成员标识符到内存位置的映射 afaik。 与数组不同,不能使用基地址偏移量和大小来访问结构(对吗?)那么它是如何发生的呢? 访问是否需要 O(1)?是什么原因?

【问题讨论】:

  • 编译器根据 C 标准的规则决定成员在 struct 中的组织方式。所以它知道每个成员的偏移量是多少。编译器是否使用包含从基址偏移的指令,或者它是否能够计算成员的实际地址,是一个实现细节。
  • 写一个小程序。查看生成的程序集。
  • 搜索包装。一个编译器在特定设置中的打包不能保证与另一个编译器相同......然后了解字节序等,当您将结构指针传递给函数并访问成员时,您相信什么除了以适合成员的偏移量访问内存之外,它还能做什么?
  • “无法使用基地址偏移量和大小访问结构” - false。
  • 一般来说,机器码中不存在变量和标识符。那里的一切都只是地址。

标签: c struct memory-alignment


【解决方案1】:

我不知道您为什么认为标识符和内存位置之间没有映射?访问结构/类的成员只是:实例(结构)的地址+成员的偏移量。所以是的,访问任何成员都是常数时间 O(1)

你可以看到https://en.cppreference.com/w/c/types/offsetof :)

【讨论】:

    【解决方案2】:

    编译器知道结构中每个成员相对于结构开头的位置。因此,给定struct_name.member_name,它将结构内member_name 的偏移量添加到结构的基地址并访问该地址。

    访问是否需要 O(1)

    是的。

    【讨论】:

    • @EricPostpischil 我错了
    • @EricPostpischil GAH!我无法删除已接受的答案...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多