Я хочу хранить ограниченное количество элементов в контейнере. Я не хочу использовать массив, потому что хочу избежать ненужных вызовов конструктора объектов. Я не хочу использовать std::vector
из-за неявного вызова malloc
(я хочу минимизировать доступ к куче для максимальной когерентности кеша).Обход правил C++ с строгим сглаживанием
Поэтому я решил определить свой собственный контейнер, что-то вроде этого:
template<typename T, size_t capacity> class my_array {
private:
char buffer[sizeof(T)*capacity];
...
public:
T& operator[](size_t i) { return *(T*)&buffer[i*sizeof(A)]; }
...
};
Но когда я пытаюсь на самом деле использовать этот контейнер, я получаю предупреждение компилятора о нарушении правил строгого сглаживания. Я читал о строгом сглаживании, и я понимаю, почему оптимизация компилятора может привести к разрыву вышеуказанного кода.
Как мне обойти это?
Странно, что мой компилятор не жалуется на мой собственный класс object_pool
, который, среди прочего, я использую для пользовательского распределителя для моих ассоциативных структур данных STL. Этот класс выглядит ужасно похожим на вышеизложенное (использует char[]
и делает аналогичный перевод). Я не могу понять, какая разница между ними.
Не можете ли вы просто использовать 'std :: array'? Или 'std :: tr1 :: array' или' boost :: array' у вас нет поддержки C++ 11? – juanchopanza
У меня нет поддержки C++ 11. Даже если бы я это сделал ... другое требование, которое я имею, это то, что я не хочу называть конструктор 'T' немедленно, по соображениям производительности.Я должен был упомянуть это требование, я отредактирую свой пост. – dshin