- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Empty base optimization是很棒的。但是,它具有以下限制:
Empty base optimization is prohibited if one of the empty base classes is also the type or the base of the type of the first non-static data member, since the two base subobjects of the same type are required to have different addresses within the object representation of the most derived type.
static_assert
将失败。而更改任一
Foo
或
Bar
改为从
Base2
继承将避免错误:
#include <cstddef>
struct Base {};
struct Base2 {};
struct Foo : Base {};
struct Bar : Base {
Foo foo;
};
static_assert(offsetof(Bar,foo)==0,"Error!");
Bar
是一种类型和
foo
是该类型的成员变量。我不明白为什么
Bar
的基类与
foo
类型的基类有关, 或相反亦然。
&foo
与
Bar
的地址相同包含它的实例——因为它需要在其他情况下 (1)。毕竟,我并没有对
virtual
做任何花哨的事情继承,不管基类都是空的,用
Base2
编译表明在这种特殊情况下没有任何问题。
StandardLayoutType
中成为强制性的s(尽管上面的
Bar
不是
StandardLayoutType
)。
最佳答案
好吧,似乎我一直都错了,因为对于我的所有示例,都需要为基础对象存在一个 vtable,这将阻止空基础优化开始。我会让这些例子站着,因为我认为它们给出了一些有趣的例子,说明为什么唯一地址通常是一件好事。
更深入地研究这一点后,当第一个成员与空基类的类型相同时,没有技术原因禁用空基类优化。这只是当前 C++ 对象模型的一个属性。
但是在 C++20 中会有一个新属性 [[no_unique_address]]
这告诉编译器非静态数据成员可能不需要唯一地址(从技术上讲,它可能与 [intro.object]/7 重叠)。
这意味着(强调我的)
The non-static data member can share the address of another non-static data member or that of a base class, [...]
[[no_unique_address]]
来“重新激活”空基类优化。 .我添加了一个示例
here这显示了这个(以及我能想到的所有其他情况)是如何工作的。
int stupid_method(Base *b) {
if( dynamic_cast<Foo*>(b) ) return 0;
if( dynamic_cast<Bar*>(b) ) return 1;
return 2;
}
Bar b;
stupid_method(&b); // Would expect 0
stupid_method(&b.foo); //Would expect 1
void delBase(Base *b) {
delete b;
}
Bar *b = new Bar;
delBase(b); // One would expect this to be absolutely fine.
delBase(&b->foo); // Whoaa, we shouldn't delete a member variable.
struct Base {
virtual void hi() { std::cout << "Hello\n";}
};
struct Foo : Base {
void hi() override { std::cout << "Guten Tag\n";}
};
struct Bar : Base {
Foo foo;
};
Bar b;
b.hi() // Hello
b.foo.hi() // Guten Tag
Base *a = &b;
Base *z = &b.foo;
a->hi() // Hello
z->hi() // Guten Tag
关于c++ - 为什么空基类也是成员变量时禁止空基优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59647419/
仍在掌握 C++ 类的窍门,我想知道实现此目的的最高效的运行时方法是什么: 我有一个派生类,我想实例化一次(在编译时已知),但我想将指针类型转换为基类指针并将其传递给我的程序的其余部分使用。这样,如果
我是一名优秀的程序员,十分优秀!