让我说我有类似的东西:
class C
{
private:
__m128i m0;
__m128i m1;
__m128i cm0;
int s0;
...
}
这可能会导致问题,因为m0,m1和cm0不能保证16字节对齐,从而允许与对齐相关的访问冲突。如果我绝对想要私人simd类成员,我可以保证,我应该怎么做?
编辑:特别是在我的情况下,我正在使用一个具有__m128i成员的类的std :: vector(除了32位和64位整数。是否可以强制我的类成员的16字节对齐一个std :: vector?
答案 0 :(得分:1)
这是我找到解决自己问题的解决方法。
我所做的是双重的:
最初,我一直在使用类似的东西:
std::vector<C> myVector(mySize);
我选择了改为:
C* myVector = _aligned_malloc(sizeof(C) * mySize, 16);
其次,我在C类中添加了一些变量填充,这样它的大小(以字节为单位)就是16的倍数。我不喜欢浪费的空间,所以我可能会在未来(也许是simd变量的一个内存块和其他变量的单独块)。
答案 1 :(得分:1)
如果你不介意浪费一点RAM,你可以做一个aligned_holder包装器类,它将保证它所拥有的对象将与你指定的任何对齐边界对齐。 (注意浪费的RAM量等于指定的对齐边界)
#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
#include <new>
// Makes sure that its held object is always aligned to the specified alignment-value,
// at the cost of using up some extra RAM.
template<class T, int AlignTo=16> class aligned_holder
{
public:
aligned_holder()
{
new (getAlignedPointer()) T();
}
~aligned_holder()
{
getAlignedObject().~T();
}
T & getAlignedObject() {return *reinterpret_cast<T*>(getAlignedPointer());}
const T & getAlignedObjectConst() const {return *reinterpret_cast<const T*>(getAlignedPointerConst());}
private:
char * getAlignedPointer()
{
const ptrdiff_t offset = intptr_t(_buf)%AlignTo;
return &_buf[(intptr_t)(AlignTo-offset)];
}
const char * getAlignedPointerConst() const
{
const ptrdiff_t offset = intptr_t(_buf)%AlignTo;
return &_buf[(intptr_t)(AlignTo-offset)];
}
char _buf[AlignTo+sizeof(T)];
};
...和一个单元测试,(希望)验证我没有弄乱这个例子:
class IWannaBeAligned
{
public:
IWannaBeAligned()
{
const intptr_t iThis = (intptr_t)(this);
if ((iThis % 16) != 0) printf("Error! object %p is not 16-byte aligned! (offset=%ld)\n", this, iThis%16);
else printf("Good, object %p is 16-byte aligned.\n", this);
}
~IWannaBeAligned()
{
printf("Deleting object %p\n", this);
}
char buf[32]; // just to give it a more realistic object size than one byte
};
int main()
{
{
printf("First, let's try it without the aligned_holder:\n");
IWannaBeAligned notAligned;
}
printf("\n");
{
printf("Now, we'll try it with the aligned_holder:\n");
aligned_holder<IWannaBeAligned> isAligned;
}
return 0;
}
答案 2 :(得分:0)
在C ++ 11中,您可以使用alignas。正如该页面上的示例所示,您的代码可以这样写:
class alignas(16) C
{
private:
__m128i m0;
__m128i m1;
__m128i cm0;
int s0;
...
}