Spec-Zone.ru › C++

C++ атрибут: no_unique_address (с C++20)

Разрешает перекрытие этого элемента данных с другими нестатическими элементами данных или подобъектами базового класса его класса.

Синтаксис

[[no_unique_address]]

Объяснение

Применяется к имени, объявленному в объявлении нестатического элемента данных, который не является битовым полем.

Делает этот элемент под-объекта потенциально перекрываемым, т.е. позволяет этому элементу перекрываться с другими нестатическими элементами данных или под-объектами базового класса его класса. Это означает, что если у элемента есть пустой тип класса (например, бессостояниевой allocator), компилятор может оптимизировать его, чтобы он занимал никакого места, так же, как если бы это был пустой базовый класс. Если элемент не пустой, любое заполнение хвоста в нём также может быть повторно использовано для хранения других элементов данных.

Примечания

[[no_unique_address]] игнорируется MSVC даже в режиме C++20; вместо этого предоставляется [[msvc::no_unique_address]].

Пример

#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()
{
    // the size of any object of empty class type is at least 1
    static_assert(sizeof(Empty) >= 1);
 
    // at least one more byte is needed to give e a unique address
    static_assert(sizeof(X) >= sizeof(int) + 1);
 
    // empty member optimized out
    std::cout << "sizeof(Y) == sizeof(int) is " << std::boolalpha 
              << (sizeof(Y) == sizeof(int)) << '\n';
 
    // 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';
}

Возможный вывод:

sizeof(Y) == sizeof(int) is true
sizeof(W) == 2 is true

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/attributes/no_unique_address

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API