【发布时间】:2012-07-25 08:41:29
【问题描述】:
我正在尝试(并已解决)包含 SSE 优化成员的类的 16 字节对齐问题。但困扰我的是,我在网上找到的大部分示例都包含一行代码,在我看来这些代码完全是多余的,但在许多地方却重复出现。
public:
void* operator new (size_t size)throw (std::bad_alloc)
{
void * p = _aligned_malloc(size, 16);
if (p == 0) throw std::bad_alloc();
return p;
}
void operator delete (void *p)
{
Camera* pC = static_cast<Camera*>(p);
_aligned_free(p);
}
有问题的行是
Camera* pC = static_cast<Camera*>(p);
由于 pC 永远不会被引用并且在函数末尾超出范围,这样做有什么意义?我试过把这条线拿出来,它似乎根本没有什么区别,但这条线出现在很多例子中!我是否遗漏了一些非常明显的东西,或者是否有异常的代码行被盲目地从一个示例复制到另一个示例,并在许多“教程”中变得普遍?
【问题讨论】:
-
我可能会这样做的一个原因是协助调试。使用 '_aligned_free(p);' 上的断点,我可以检查 Camera* pC 对象。
-
如果示例始终是
Camera,那么它肯定是从一个教程复制到另一个教程。盲目地或其他方式。 -
不,Camera 是我自己的类 - 用每个教程中的类名替换它:)
-
重载全局
operator new和operator delete几乎肯定不是一个好主意。另外,请注意您的operator new已损坏,因为它应该在投掷之前依次调用所有new_handlers。 /编辑:忘记评论的第一部分,我没有注意到这是在一个类中。评论的第二部分仍然有效。 -
@StuartEagles:也许您应该链接到包含代码的许多地方中的 3 或 4 个。评论教程的整个部分可能比评论几行代码更容易,我同意,这些代码看起来不协调。正如 Konrad 所说,
operator new无论如何都是狡猾的,所以甚至可能最好找到另一个教程。
标签: c++ replace delete-operator static-cast