gpt4 book ai didi

c++ - boost aligned_allocator 对齐参数不影响实际对齐

转载 作者:行者123 更新时间:2023-11-28 05:58:57 24 4
gpt4 key购买 nike

我正在使用 boost::alignment::aligned_allocator 以使 vector 的元素对齐。

但是,我注意到一个我无法在文档中解释的行为:如果我通过关键字 alignas 指定对齐,它会按预期工作,但如果我使用分配器的模板参数则不会。

实际上,我找不到这个 tempoate 参数的原因,它似乎对实际对齐没有任何影响(即如果我有 alignas(64) 和 16 作为对齐模板参数,无论如何它都会使用 64)。

我用 g++ 4.9 和 clang 3.6 测试了以下代码并得到了相同的输出。 As 和 Bs 都应该对齐。但是 B 对象根本没有对齐。

谢谢!

#include <iostream>
#include <vector>
#include <algorithm>

#include <boost/align/aligned_allocator.hpp>

using namespace std;

struct alignas(64) A { };
struct B { };

template <int _AlignT = 64, typename _ContainerT>
bool is_aligned(_ContainerT&& c)
{
return all_of(begin(c), end(c), [](auto& e) { return (ptrdiff_t)&e % _AlignT == 0; });
}

int main()
{
std::vector<A, boost::alignment::aligned_allocator<A>> va(3);
cout << "A aligned:" << boolalpha << is_aligned(va) << endl;

std::vector<B, boost::alignment::aligned_allocator<B, 64>> vb(3);
cout << "B aligned:" << boolalpha << is_aligned(vb) << endl;

for_each(begin(vb), end(vb), [](auto& e) { cout << (void*)&e << endl; });

return 0;
}

输出:

A aligned:true
B aligned:false
0xaeb180
0xaeb181
0xaeb182

最佳答案

正如评论中指出的那样,_boost::alignment::aligned_allocator_ 确实负责元素的对齐——即 std::vector 使用的整个内存块- 但不是每个元素

为了使 std::vector 的所有元素对齐,而不仅仅是第一个元素,必须使用alignas 和对齐模板参数

这里有一个例子可以清楚地说明这一点:

#include <iostream>
#include <vector>
#include <algorithm>

#include <boost/align/aligned_allocator.hpp>

using namespace std;

struct alignas(64) A { };
struct B { };

template <int _AlignT = 64, typename _ContainerT>
bool is_aligned(_ContainerT&& c)
{
return all_of(begin(c), end(c), [](auto& e) { return (ptrdiff_t)&e % _AlignT == 0; });
}

int main()
{
{
std::vector<A> vc(1);
cout << "vector<A> aligned: " << boolalpha << is_aligned(vc) << endl;
vc.resize(3);
cout << "vector<A>'s elements aligned: " << boolalpha << is_aligned(vc) << endl;
}

{
std::vector<B, boost::alignment::aligned_allocator<B, 64>> ve(1);
cout << "vector<B, aligned_alloc> aligned: " << boolalpha << is_aligned(ve) << endl;
ve.resize(3);
cout << "vector<B, aligned_alloc>'s elements aligned: " << boolalpha << is_aligned(ve) << endl;
}

{
std::vector<A, boost::alignment::aligned_allocator<A, 64>> vd(3);
cout << "vector<A, aligned_alloc> aligned: " << boolalpha << is_aligned(vd) << endl;
vd.resize(3);
cout << "vector<A, aligned_alloc>'s elements aligned: " << boolalpha << is_aligned(vd) << endl;
}

return 0;
}

输出:

vector<A> aligned: false
vector<A>'s elements aligned: false
vector<B, aligned_alloc> aligned: true
vector<B, aligned_alloc>'s elements aligned: false
vector<A, aligned_alloc> aligned: true
vector<A, aligned_alloc>'s elements aligned: true

请注意,在 std::vector 的情况下,正如我指定的 alignas(64),容器本身未对齐,但每个元素之间的距离是 64 字节:

vector<A> element: 0x75b060
vector<A> element: 0x75b0a0
vector<A> element: 0x75b0e0

关于c++ - boost aligned_allocator 对齐参数不影响实际对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33642216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com