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

Yas*_*has 1 c++ struct compile-time memory-address

struct A {
    int a;
    .
    .
    .
    int b;
} obj;
Run Code Online (Sandbox Code Playgroud)

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

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

diff始终是积极的?

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

Bat*_*eba 5

的行为

const ptrdiff_t diff = &obj->b - &obj->a;
Run Code Online (Sandbox Code Playgroud)

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

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

虽然我从来没有遇到过没有给你带来"明智"结果的编译器,但是不要像这样编写代码,因为你不是在编写可移植的C++.随着编译器优化技术变得越来越激进,您可以完全期望基于此的代码在未来中断.