由于某种原因(数据驻留在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)如果是开销,那么使用示例中显示的对齐访问的原因是什么?
答案 0 :(得分:0)
不是开销吗?
也许。也许不吧。对于大多数类型,我希望aligned_storage::type
大小等于包含的类型大小。而且我希望编译器优化访问权限不会比原始数组访问更糟糕。
我可以为
(sizeof(data[N]))
分配和访问内存 如果是开销,那么使用示例中显示的对齐访问的原因是什么?
是的,您可以分配原始内存(例如,使用char
数组),但您必须确保它与您正在使用的类型正确对齐。如果你想按值存储一些未初始化的数组或者在堆栈上分配一些内存,这并不容易。或者,如果您使用的自定义内存分配器不使用new
/ malloc
且没有其对齐属性。
aligned_storage
结构是一个帮助自动化你自己写的东西。