Меняет ли добавление статического члена constexpr отображение памяти структуры / класса? - PullRequest
0 голосов
/ 27 октября 2018

Примечание. Этот вопрос возник в контексте совместной памяти между программами на C ++ и C #.

В C ++ 11 меняет ли добавление члена static constexpr что-либо с точки зрения отображения памяти? Я бы интуитивно сказал, что член static constexpr не занимает никакой памяти, но я полагаю, что я игнорирую какой-то очень фундаментальный аспект, такой как полиморфизм, например ...

Итак, в следующем примере гарантированно, что экземпляр Dummy и экземпляр Dummy2 занимают одинаковый объем памяти?

struct Dummy {
  static constexpr std::size_t kSize = 512;
  char data[kSize];
};


static constexpr std::size_t kSize2 = 512;
struct Dummy2 {
  char data[kSize2];
};

В этом тесте эта теория не опровергнута, но я очень далек от того, чтобы сказать, что это гарантировано.

int main() {
    std::cout << sizeof(Dummy) << " " << sizeof(Dummy2) << std::endl;
}

512 512

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Определение языка накладывает несколько ограничений на макет объекта, но в рамках этих ограничений компилятор имеет большую свободу действий.Определение языка не требует изменения макета при добавлении статического элемента и не запрещает его изменение.Нет очевидных причин для изменения макета, но нет абсолютного ответа.Вероятно, это не изменится, но если это действительно имеет значение, попробуйте и посмотрите.

0 голосов
/ 27 октября 2018

Dummy и Dummy2 совместимы с макетом (статические члены не имеют значения), см. class.mem / 23 .

Однако стандарт не определяет, какие именно свойства совместимы с макетом типов (он определяет только, когда два типа совместимы с макетом , но ничего не говорит о последствия). Предполагается, что они имеют одинаковое расположение в памяти, поэтому можно предположить, что sizeof(Dummy) равно sizeof(Dummy2).

0 голосов
/ 27 октября 2018

В соответствии со стандартом языка

9.4.2 Элементы статических данных [class.static.data]

  1. Элемент статических данныхне является частью подобъектов класса .Если статический член данных объявлен как локальный поток, существует одна копия члена на поток.Если статический элемент данных не объявлен как thread_local, существует одна копия элемента данных, которая является общей для всех объектов класса.

выделение мое.

Это ненезависимо от того, является ли это constexpr или нет;это статический , и поэтому не является частью композиции экземпляра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...