По какой-то причине (данные хранятся в виртуальной памяти boost/interprocess/file_mapping.hpp) Я пишу свое собственное распределение памяти. Для обеспечения межплатформенной переносимости я отношусь к выравниванию памяти общего типа T
. (Примечание T
сильно POD или простой C++ скалярная как char
или int
) Из примера в http://en.cppreference.com/w/cpp/types/aligned_storage мы можем увидеть следующий код:Выровненный доступ к элементам массива
...
typename std::aligned_storage<sizeof(T), alignof(T)>::type data[N];
std::size_t m_size = 0;
public:
// Create an object in aligned storage
template<typename ...Args> void emplace_back(Args&&... args)
{
if(m_size >= N) // possible error handling
throw std::bad_alloc{};
new(data+m_size) T(std::forward<Args>(args)...);
.....
Таким образом, вместо регулярного доступа data[i]
Я всегда оценивать соответствие адрес.
Так что мой вопрос:
1) Является ли это не накладные расходы? И я могу просто выделить и получить доступ к памяти для (sizeof(data[N]))
2) Если это накладные расходы по причине использования выровненного доступа, показанного в примере?
Я думаю, нам нужен более полный пример, но теперь код, который я вижу, теперь вызывает новое размещение для каждого объекта, что полезно, если они являются объектами, и с достаточной инкрустацией станет «почти ничего». Как всегда, «это медленнее, чем идеал», вам действительно нужно измерить это, а не просто смотреть на код в теории, поскольку компиляторы иногда очень умны, а иногда нет, на основе крошечных деталей. –
Пример статического векторного класса в cppreference содержит массив символов для хранения данных. Отсутствует атрибут выравнивания для символов или массивов символов. Если теперь вы попытаетесь сохранить двойной адрес по произвольно выровненному адресу массива (т. Е. Тот, который не находится, например, на границе 4 байта), программа может потерпеть крах. Поэтому, как правильно указывает @Revolver, массив символов должен начинаться с адреса, который соответствующим образом выровнен для типа (и будет делать все будущие элементы в нем правильно выровненными, тоже без заполнения). –