gpt4 book ai didi

c++ - 对齐 : warning C4316 in all classes that have aligned members

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:47 25 4
gpt4 key购买 nike

今天我遇到了很多麻烦,因为我跟踪了一个非常隐蔽的腐败漏洞。
我想如果我真的注意警告就不会那么难找到它,但由于找不到有关为什么弹出此特定警告的相关信息,我让它滑动了,这是一个错误。

所以这是 Visual Studio 2013 给我的有罪警告:

warning C4316: object allocated on the heap may not be aligned 16

它是在通过 const 引用将 align(16) 临时传递给构造函数时生成的,如以下代码所示:

class Vector
{};

__declspec(align(16)) class VectorA
{};

class Shape
{
public:
Shape(const Vector& vec) {}
};

class ShapeA
{
public:
ShapeA(const VectorA& vec) : mVec(vec) {}

private:
VectorA mVec;
};

int main(int argc, char *argv[])
{
Shape* shape = new Shape(Vector()); // ok
ShapeA* shapea = new ShapeA(VectorA()); // warning C4316:
// object allocated on the heap may not be aligned 16
}

这带来了几个问题:

  1. 由于我不负责所述结构的对齐(它来自库),所以我无法真正影响它。解决此问题的推荐方法是什么?

  2. 因为这是一个警告,我猜它不会产生戏剧性的效果。但我发现的效果非常显着且无声(只有在将完全不相关的浮点引用传递给 sqlite 函数时才会出现)。(编辑:这实际上是错误的,堆并没有因为以下原因而损坏this) 真的像这样直截了当:“这段代码肯定会导致堆损坏,不要这样做。” ?还是有更复杂的行动链导致这样的事情?

我想到的一个解决方法是为对齐的对象设置一个 unique_ptr 而不是将其作为直接成员,但我有点不愿意在我之前有普通结构的任何地方添加 unique_ptr (即使它允许我 pimpl我的代码)

附录

事实证明,我正在子类化 VectorA 类,它确实提供了新的删除重载以确保正确对齐,但我自己的子类没有。但是在下一段中第二次出现此警告更难以摆脱:

扩展

产生警告的另一种情况如下:

__declspec(align(16)) class VectorA
{
void* operator new(size_t size)
{
void* p = _aligned_malloc(size, 16);
if(p == 0) throw std::bad_alloc();
return p;
}

void operator delete(void *p)
{
VectorA* pc = static_cast<VectorA*>(p);
_aligned_free(p);
}
};

class ShapeB
{
public:
ShapeB() {}

private:
VectorA mVec;
};

int main()
{
std::unique_ptr<BoxShapeB> shapeb = std::make_unique<BoxShapeB>();
}

似乎我的任何类在实例化时都会像本例中那样具有对齐成员,也会产生警告。就像我上面说的,删除警告的一种方法是指向这些成员。此警告未出现在具有相同代码的 Visual Studio 的先前版本中,因此我的问题是:上述明显错误的程度有多大,是否应不惜一切代价避免?即我应该如何处理警告?

假设我的大部分类都有一个公共(public)基类 Object,并且我的大部分类都有 align(16) Vector 作为成员,是否值得将重载的 new 和 delete 放在这个基类中而忘记转向我所有的成员 vector 到指针?这种方法行得通吗?

最佳答案

此问题与通过 const 引用传递对齐结构或不按照您的建议传递对齐结构无关。 See this documentation of C4316 .问题是您声明了对齐结构,但没有提供处理此对齐的适当的新/删除运算符。

如果您在使用预构建的第 3 方库时遇到这种情况,恕我直言,您应该向其作者报告一个请求以解决此问题。如果您可以自己构建这个库,那么您可以自己添加提到的运算符。

关于c++ - 对齐 : warning C4316 in all classes that have aligned members,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21763783/

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