Fra*_*une 7 c++ stl vector alignment
实行std::vector随Visual Studio 2010和更早版本有一个众所周知的特殊性:该resize方法具有以下特征(C++ 03兼容的):
void resize(size_type new_size, value_type value);
Run Code Online (Sandbox Code Playgroud)
而不是C++ 11之前很久以来大多数其他STL实现(如gcc的STL或STLport)使用的符合C++ 11的签名:
void resize(size_type new_size, const value_type& value);
Run Code Online (Sandbox Code Playgroud)
第一个变体的问题是,在某些情况下,如果value_type具有对齐规范,它将无法编译:
struct __declspec(align(64)) S { ... };
std::vector<S> v; // error C2719: '_Val': formal parameter with __declspec(align('64')) won't be aligned
Run Code Online (Sandbox Code Playgroud)
这是一个公 知的问题,还没有令人满意的解决方法除了使用不同的实现std::vector.
我正在寻找一个编写良好,经过良好测试,自包含且与STL兼容std::vector的MIT风格许可证实现,我可以将其作为对齐类型的首选容器放入我的项目中.
我考虑过从STLport或gcc的STL中提取它,但是,由于完全符合标准,它们都很大,有很多非平凡的依赖.
(我将非常高兴与合理子集的实现std::vector,将仅支持push_back,clear,capacity,size,reserve,resize,swap和数组索引).
有任何想法吗?
Eigen库后面的人似乎找到了一个很好的解决方法,用于存储"过度对齐类型"(如Stephan T. Lavavej称之为)的问题,并将其存储到std::vectorVisual Studio的STL中.
它们的实现似乎不必要复杂(在这里和这里查看源代码),但主要思想是封装std::vector使用瘦包装器进入的类型:
#include <vector>
template <typename T>
struct wrapper : public T
{
wrapper() {}
wrapper(const T& rhs) : T(rhs) {}
};
struct __declspec(align(64)) S
{
float x, y, z, w;
};
int main()
{
std::vector< wrapper<S> > v; // OK, no C2719 error
return 0;
}
Run Code Online (Sandbox Code Playgroud)
关于Eigen的实现,我必须承认我不太了解
Eigen::aligned_allocator_indirection,EIGEN_WORKAROUND_MSVC_STL_SUPPORT,Eigen::workaround_msvc_stl_support,resize他们std::vector对Eigen::aligned_allocator_indirection分配器的部分专业化......线索欢迎.关键是,这个技巧完美无缺(据我所知)并且我没有看到任何错误,除了可能从轻微的不雅.
| 归档时间: |
|
| 查看次数: |
2027 次 |
| 最近记录: |