- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
今天我遇到了很多麻烦,因为我跟踪了一个非常隐蔽的腐败漏洞。
我想如果我真的注意警告就不会那么难找到它,但由于找不到有关为什么弹出此特定警告的相关信息,我让它滑动了,这是一个错误。
所以这是 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
}
这带来了几个问题:
由于我不负责所述结构的对齐(它来自库),所以我无法真正影响它。解决此问题的推荐方法是什么?
因为这是一个警告,我猜它不会产生戏剧性的效果。但我发现的效果非常显着且无声(只有在将完全不相关的浮点引用传递给 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/
我试图找出在表格单元格上放置对齐属性与使用 text-align css 属性之间的区别。下面的代码显示了 IE 与其他浏览器中的不同结果。在 IE 中,对齐最终会对齐每个子子项,因此文本“test”
我正在 summernote HTML 编辑器上做一些 POC,我正在使用自定义工具栏,但我不知道如何添加对齐(左对齐、居中对齐、右对齐)工具栏,所以有人可以帮助我实现这一目标。 还有人可以帮我找到更
以下是从节对齐转换为文件对齐的步骤: 找到数据的 RVA 从 RVA 导出引用的数据所属的部分。这是微不足道的,因为部分不重叠。文件头中提供了各个部分的起始地址。 找出RVA和section的起始地址
align-self 在以下代码中, align-self 与 flex-wrap: nowrap 一起使用。 flex-container { display: flex; flex-wra
这是CSS: .divPhoto { border:1px solid #999; width:140px; height:140px; border-radius:3
我正在为 Windows Phone 8 开发,我已经设计了我的应用程序,我注意到有一个“分配网格”代码,默认情况下可以在新项目中取消注释。 看看下面的文件中的描述: --> 这是取
我们有浏览器前缀或黑客 (for Google and Safari) text-align: -webkit-right; (for Firefox) text-align:
最近我观察到,在 Clang 9.0 上 alignof 和 __alignof 为 unsigned long long 返回不同的值,并且在 https://reviews.llvm.org/D5
我已经一年多没有为 Android 开发了,我对它有点生疏了。我正在尝试设置一个有点简单的 UI:屏幕底部的底部栏和它上面的 fragment (但没有填充整个高度)。像这样: 我认为这会很简单,但经
你好,我正在尝试找到一种使用“讨厌的”align=center 技巧的方法.. 嗯,当我查看一些代码时,我注意到两个非常相似的片段呈现的并不相同。我找不到让他们表现相同的方法。这包括用 div 替换顶
抱歉这个愚蠢的问题。我只想知道我们什么时候讨论内存中的数据应该如何对齐之类的。这个主题是叫“内存对齐”还是“数据对齐”,还是我可以随便叫它什么? 最佳答案 在编程的上下文中,它被称为 data str
所以我只是想制作一个简单的导航栏,并且我刚开始使用 flexbox。为什么 align-content 在这里不起作用?我可以让 justify-content 工作,但我就是无法垂直对齐。这是代码。
我从这个 SO 开始答案,我试图使用提供的纯 flexbox 答案。 然而,当我尝试这个时,我看到了以下结果。 我不确定为什么 Button 4 在行中出现的位置高于其余元素。 HTML
我已通读 A complete guide to Grid ,但仍然对两组容器属性之间的差异感到困惑,即“justify/align-items”与“justify/align-content”。 我
我有一个simple plunker here. .container { display:flex; flex-flow: row nowrap; justify-content: sp
从 http://code.google.com/p/berkeleyaligner/ 下载主干代码后,我将该项目添加到 Eclipse 上的构建路径中。然后,使用下面的代码,我可以提取从 sourc
这个问题在这里已经有了答案: What's the difference between align-content and align-items? (15 个答案) 关闭 7 年前。 我发现 C
[short text][image1][image2]____________________________________ [this is a reallyyyyyyy............
我有一个很小的菜单列表,当鼠标靠近时它应该会增长。在其原始状态下,菜单是右对齐的,悬停时每第二个元素向右移动并左对齐以为增加的高度腾出空间(参见 JSFiddle )。 ul { font-siz
这个问题在这里已经有了答案: Align child elements of different blocks (3 个答案) 关闭 3 年前。
我是一名优秀的程序员,十分优秀!