gpt4 book ai didi

c++ - 空基类优化

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:00 33 4
gpt4 key购买 nike

下面是ebco上的简单测试,我在vc9和g++上都编译了。两个编译器的输出不同。我想知道的是vc的行为是否符合。

#include <iostream>

class empty
{
};

class empty_one : public empty {};
class empty_two : public empty {};

class non_empty
: public empty_one
, public empty_two
{
};

int main()
{
std::cout << "sizeof(empty): " << sizeof(empty) << std::endl;
std::cout << "sizeof(empty_one): " << sizeof(empty_one) << std::endl;
std::cout << "sizeof(empty_two): " << sizeof(empty_two) << std::endl;
std::cout << "sizeof(non_empty): " << sizeof(non_empty) << std::endl;

std::cout << std::endl;

non_empty a[2];

void* pe10 = static_cast<empty*>(static_cast<empty_one*>(&a[0]));
void* pe20 = static_cast<empty*>(static_cast<empty_two*>(&a[0]));
std::cout << "address of non_empty[0]: " << &a[0] << std::endl;
std::cout << "address of empty of empty_one: " << pe10 << std::endl;
std::cout << "address of empty of empty_two: " << pe20 << std::endl;

std::cout << std::endl;

void* pe11 = static_cast<empty*>(static_cast<empty_one*>(&a[1]));
void* pe21 = static_cast<empty*>(static_cast<empty_two*>(&a[1]));
std::cout << "address of non_empty[1]: " << &a[1] << std::endl;
std::cout << "address of empty of empty_one: " << pe11 << std::endl;
std::cout << "address of empty of empty_two: " << pe21 << std::endl;
}

在 vc 上,

pe20 == pe11. (test1)

两个对象的两个子对象可以有相同的地址吗?这符合吗?

此外,

pe20 >= &a[0] + sizeof(a[0]) (test2)

子对象的地址可以通过对象的末尾吗?

在 g++ 上,以上两个测试不成立。

编辑:在 c++0x 标准草案中,1.8/6,

Unless an object is a bit-field or a base class subobject of zero size, the address of that object is the address of the first byte it occupies. Two distinct objects that are neither bit-fields nor base class subobjects of zero size shall have distinct addresses

标准要求当两个对象既不是位域也不是零大小的基类子对象时,它们具有不同的地址。但它并不要求两个零大小的子对象不能有相同的地址。那么 test1 可以是真的吗?

最佳答案

pe10 == pe11. Can two sub-objects of two objects have the same address? Is this conformant?

不可以,两个不同的对象不能有相同的地址。如果有,则编译器不是标准投诉。

顺便问一下,您使用的是哪个版本的 VC++?我正在使用 MSVC++2008,它的输出是这样的:

alt text

我想,你的意思是 pe20==pe11?如果是这样,那么这也是错误的,不规范的。 MSVC++2008编译器有bug!

海湾合作委员会是正确的;自己看输出:http://www.ideone.com/Cf2Ov


类似主题:

When do programmers use Empty Base Optimization (EBO)

关于c++ - 空基类优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4772219/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com