我最近用一些使用SSE的Vector / Matrix类替换了,现在我确保内存正确对齐.
根据this question的答案中的建议,我已经为需要它的类替换了operator new / delete,并开始使用自定义分配器与STL容器一起使用 – 但是,两者之间似乎存在一些冲突:
首先,我简单地复制并粘贴了here中的示例分配器类,当我使用它与有问题的类型的std :: vector而没有我的自定义新/删除时编译很好,但是当我替换这些函数时,我从construct()函数得到一个错误“没有匹配函数来调用’operator new’”,
void construct(pointer p, const T& t) { new(p) T(t); }
我想我已经取代了“通常的”新事实,这在某种程度上掩盖了新的位置?但是,鉴于我不能自己编写新的位置,我不知道该怎么办…我是新的(NPI)整个自定义内存分配的东西,所以任何建议都会非常感谢!
我正在使用Clang v3.4(或gcc 4.1.2)在Linux上进行编译;不使用C 11.
非常感谢.
解决方法:
规范的allocator::construct调用:: new((void *)p)T(val)
通过省略::,你可以让名字查找从T的类范围开始,在那里它找到你的类范围的运算符new并且没有继续进行(name lookup在第一个范围内停止,其中找到任何匹配的名称,即使在某些封闭范围内存在更好的候选人)
(转换为void是为了防止用户潜入全局几乎放置的新重载,该重载采用非void指针参数)
PS:正如评论中正确指出的那样,“鉴于我不能写自己的位置新”是错误的假设.您无法替换全局placement-new,但您当然可以编写一个特定于类的placement new,然后通过类范围查找来获取它.查看cppreference以获取有关分配功能的摘要.