对齐访问数组元素

时间:2016-01-30 08:48:21

标签: c++ memory-management memory-alignment

由于某种原因(数据驻留在boost / interprocess / file_mapping.hpp的虚拟内存中)我编写自己的内存分配。为了实现跨平台的可移植性,我关注通用T的内存对齐。 (注意T是强烈的POD或简单的C ++标量,如charint) 从示例中 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)如果是开销,那么使用示例中显示的对齐访问的原因是什么?

1 个答案:

答案 0 :(得分:0)

  

不是开销吗?

也许。也许不吧。对于大多数类型,我希望aligned_storage::type大小等于包含的类型大小。而且我希望编译器优化访问权限不会比原始数组访问更糟糕。

  

我可以为(sizeof(data[N]))分配和访问内存   如果是开销,那么使用示例中显示的对齐访问的原因是什么?

是的,您可以分配原始内存(例如,使用char数组),但您必须确保它与您正在使用的类型正确对齐。如果你想按值存储一些未初始化的数组或者在堆栈上分配一些内存,这并不容易。或者,如果您使用的自定义内存分配器不使用new / malloc且没有其对齐属性。

aligned_storage结构是一个帮助自动化你自己写的东西。