- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经阅读了新的 c++20 特性 no_unique_address
好几次,我希望如果有人能用一个比下面这个来自 c++ 引用的例子更好的例子来解释和说明。
Explanation Applies to the name being declared in the declaration of anon-static data member that's not a bit field.
Indicates that this data member need not have an address distinct fromall other non-static data members of its class. This means that if themember has an empty type (e.g. stateless Allocator), the compiler mayoptimise it to occupy no space, just like if it were an empty base. Ifthe member is not empty, any tail padding in it may be also reused tostore other data members.
#include <iostream>
struct Empty {}; // empty class
struct X {
int i;
Empty e;
};
struct Y {
int i;
[[no_unique_address]] Empty e;
};
struct Z {
char c;
[[no_unique_address]] Empty e1, e2;
};
struct W {
char c[2];
[[no_unique_address]] Empty e1, e2;
};
int main()
{
// e1 and e2 cannot share the same address because they have the
// same type, even though they are marked with [[no_unique_address]].
// However, either may share address with c.
static_assert(sizeof(Z) >= 2);
// e1 and e2 cannot have the same address, but one of them can share with
// c[0] and the other with c[1]
std::cout << "sizeof(W) == 2 is " << (sizeof(W) == 2) << '\n';
}
最佳答案
该功能背后的目的与您的引述中所述完全相同:“编译器可能会对其进行优化以使其不占用空间”。这需要两件事:
std::allocator
类型的对象实际上不存储任何东西。它只是一个基于类的接口(interface)进入全局
::new
和
::delete
内存分配器。不存储任何类型数据(通常通过使用全局资源)的分配器通常称为“无状态分配器”。
std::vector
.这种类型的常见实现是使用 3 个指针:一个用于数组的开头,一个用于数组有用部分的结尾,一个用于数组的已分配块的结尾。在 64 位编译中,这 3 个指针需要 24 字节的存储空间。
vector
存储一个分配器作为成员,每个
vector<T, Alloc>
即使分配器不存储任何内容,也必须至少占用 32 个字节。
vector<T, Alloc>
来自
Alloc
本身。原因是基类子对象的大小不需要为 1。如果基类没有成员且没有非空基类,则允许编译器在派生类中优化基类的大小实际上不占用空间。这称为“空基优化”(标准布局类型需要它)。
vector<T, Alloc>
从这个分配器类型继承的实现仍然只有 24 个字节的大小。
final
,这实际上是标准允许的。其次,分配器可能有干扰
vector
的成员。的成员。第三,这是人们必须学习的习语,这使它成为 C++ 程序员的民间智慧,而不是任何人都可以使用的明显工具。
[[no_unique_address]]
是为了。它允许容器将分配器存储为成员子对象而不是基类。如果分配器为空,则
[[no_unique_address]]
将允许编译器使其不占用类定义中的空间。所以这样一个
vector
大小仍可能为 24 字节。
e1 and e2 cannot have the same address, but one of them can share with c[0] and the other with c1 can some one explain? why do we have such kind of relation ?
e1
和
e2
不是同一个对象,因此违反了#3。它们也共享相同的类型,因此违反了 #1。因此,他们必须遵循#2:他们不能有相同的地址。在这种情况下,由于它们是相同类型的子对象,这意味着该类型的编译器定义的对象布局不能在对象内给它们相同的偏移量。
e1
和
c[0]
是不同的对象,所以 #3 再次失败。但它们满足#1,因为它们有不同的类型。因此(遵循
[[no_unique_address]]
的规则)编译器可以将它们分配给对象内的相同偏移量。
e2
也是如此和
c[1]
.
关于c++ - c++20 [[no_unique_address]] 中的新特性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62784750/
我正在使用 c++20 中的 [[no_unique_address]]。 在 cppreference 的示例中我们有一个空类型 Empty 和类型 Z struct Empty {}; // em
我正在玩弄 [[no_unique_address]] C++20 中引入的属性。据我了解cppreference article和标准的 dcl.attr.nouniqueaddr 章节,此属性指示
考虑 following : struct Base {}; struct Empty {}; struct X : Base { int i; [[no_unique_address]] E
[dcl.attr.nouniqueaddr] 中的注释说: [Note 1: The non-static data member can share the address of another
C++ 20引入了新属性 [[no_unique_address]] ,它指示数据成员不必具有与该类的所有其他非静态数据成员不同的地址。 因此,我尝试使用此新属性来实现我自己的 vector ,该 v
我已经阅读了新的 c++20 特性 no_unique_address好几次,我希望如果有人能用一个比下面这个来自 c++ 引用的例子更好的例子来解释和说明。 Explanation Applies
我是一名优秀的程序员,十分优秀!