出于某种原因(数据驻留在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上的示例静态矢量类包含一个用于存储数据的char数组。字符或char数组没有对齐保证。如果您现在尝试在任意对齐的数组地址(即不在4字节边界处)存储双精度数据,程序可能会崩溃。因此,正如@Revolver正确指出的那样,char数组必须从一个适合该类型对齐的地址开始(并且将使其中所有将来的元素正确对齐,而实际上没有填充)。 –