【问题标题】:difference between addresses of struct members as compile time constant结构成员地址之间的差异作为编译时间常数
【发布时间】:2017-12-14 09:45:24
【问题描述】:
struct A {
    int a;
    .
    .
    .
    int b;
} obj;

const ptrdiff_t diff = &obj->b - &obj->a;

diff 是否总是包含一个即使程序运行多次也不会改变的常量?

diff 是否总是积极的?

有没有办法在编译时获得这种差异? (人工计数除外)

【问题讨论】:

  • 是的,是的,编译器可能会这样优化它。
  • C 还是 C++?您使用哪种实际语言进行编码,请不要无缘无故地用 C 和 C++ 标记问题。 C 不是 C++ 不是 C。
  • 我用 C++ 编写代码,但我认为这对两者都有关系。
  • @Yashas 的答案可能与两者都相关,问题不应期望两种语言的答案相同。如果你愿意,可以提出两个问题,一个用 C 做,一个用 C++ 做,但不能同时做这两个问题,这样会产生一个过于宽泛的问题。

标签: c++ struct memory-address compile-time


【解决方案1】:

行为

const ptrdiff_t diff = &obj->b - &obj->a;

未定义。如果两个指针指向同一个数组中的元素,或者一个超过该数组末尾的元素,则只能减去它们。为此,标量被视为长度为 1 的数组。

令我吃惊的是,这是 C++ 中鲜为人知的规则,而 C 也正是如此。

虽然我从未遇到过不能为您提供“合理”结果的编译器,但不要编写这样的代码,因为您不是在编写可移植的 C++。随着编译器优化技术变得越来越激进,您完全可以期待基于此的代码将来会崩溃。

【讨论】:

  • 这是 UB:if(size == (&obj->b - &obj->a)),其中 size 的类型为 int
  • 是的。一卡车 UB。
  • 取两个成员的offsetofs 的差值会给出两个数量之间的地址差吗? (我认为应该是,但我现在太害怕了)
  • @Yashas 如果您发布有关您的真正问题而不是您认为需要做的问题的问题,这将有所帮助。 meta.stackexchange.com/questions/66377/what-is-the-xy-problem
  • 我真正的问题是我需要将一个结构中间的偏移量传递给结构的另一个成员到一个用汇编编写的函数。
猜你喜欢
  • 2014-12-29
  • 2013-02-24
  • 2020-10-16
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
相关资源
最近更新 更多