结构成员的地址之间的差异作为编译时间常量

时间:2017-12-14 09:45:24

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

struct A {
    int a;
    .
    .
    .
    int b;
} obj;

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

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

diff总是积极的吗?

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

1 个答案:

答案 0 :(得分:5)

的行为
const ptrdiff_t diff = &obj->b - &obj->a;

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

令我感到惊讶的是,这是C ++中一个鲜为人知的规则,C就此而言。

虽然我从来没有碰到过那些没有给你带来明智感的编译器。结果,这样的代码,因为你没有编写可移植的C ++。随着编译器优化技术变得越来越激进,您可以完全期望基于此的代码在将来中断。