2013-10-03 3 views
4

Из любопытства я взглянул на реализацию std :: array LLVM и заметил, что это структура. Большинство других контейнеров STL, на которые я смотрел (вектор, очередь, карта), являются классами. И он появляется в стандарте как структура, поэтому является преднамеренным.Почему C++ 11 std :: array является структурой, а не классом?

Кто-нибудь знает, почему это может быть?

+2

Это, как представляется, часто применяемое соглашение для создания структур типа POD, хотя я не знаю, является ли это причиной здесь. –

+2

Агрегаты могут не иметь частных или защищенных членов, а 'std :: array' должен быть агрегатом. – dyp

ответ

10

Технически это не структура и не класс - это шаблон.

std::array должно быть aggregate. Короче говоря, это заканчивается тем, что у него нет ничего частного - так что его можно было бы записать как struct (который по умолчанию делает все общедоступным) вместо class (который по умолчанию делает все частный).

Если вы хотите, чтобы вы могли написать это как class все равно:

template <...> 
class array { 
public: 
// ... 

Но вы должны сделать все общественное в любом случае, так что вы можете также использовать struct, что делает это по умолчанию.

+0

Спасибо за ответ! Вы знаете, почему было принято решение сделать std :: array совокупностью? – elSnape

+1

@elSnape 'std :: array' старше C++ 11 (boost, C++ 03TR1) и требуется синтаксис синтаксиса инициализации в C++ 03 для таких вещей, как' std :: array my_arr = {1, 2,3,4,5}; ' – dyp

+4

@elSnape Поскольку std :: array должен быть как можно более тонким. Конструктивное решение состоит в том, что весь код std :: array должен исчезать во время компиляции, чтобы сделать его столь же эффективным (пространство и время), как голый массив. –

1

std::array типа POD, так что он может быть инициализирован следующим образом:

std::array<int, 5> arr = { 1, 2, 3, 4, 5 }; 

Это отличается от инициализации из initializer_list в том, что массив фактически не выделять новое пространство для элементов массива и двигается данные из списка инициализаторов там, но данные в скобках (которые заканчиваются в сегменте инициализированных данных) : Внутреннее представление массива.

Это означает, что копирование или перемещение не происходит, на самом деле нет кода для инициализации чего-либо. Массив готов к работе, как только ваш исполняемый файл будет загружен в память.

+0

Конструктор вариационных шаблонов может иметь одинаковый синтаксис, а перемещение elision (+ оптимизации) должно приводить к той же скорости. – dyp

+0

@DyP Нет, потому что для этого все равно потребуется выполнить код. Для 'std :: array' * код не выполняет инициализацию во время выполнения *. Нуль. Помните мой другой пост, о котором вы прокомментировали? «Нет кода» так же быстро, как и вы. – Fozi

+0

@DyP Кроме того, это решает некоторые другие проблемы, такие как неопределенный порядок инициализации и уничтожения глобальных статических объектов. Это просто не относится к 'std :: array' простых типов. Они поступают в предварительную инициализацию и существуют до тех пор, пока ОС не освободит память процессоров, как и массивы C-стиля. – Fozi

 Смежные вопросы

  • Нет связанных вопросов^_^