我正在编写一个自定义内存分配器。如果可能的话,我想让这样的对象创建功能完全抽象创建过程。
template<typename T>
class CustomCreator
{
virtual T& createObject(T value) __attribute__((always_inline))
{
T* ptr = (T*)customAlloc();
new (ptr) T(value);
return *ptr;
}
}
但这会导致复制。在这种情况下,有没有办法强制消除复制?
这是我当前的测试代码。
#include <iostream>
struct AA
{
inline static void test(AA aa) __attribute__((always_inline))
{
AA* ptr = new AA(aa);
delete ptr;
}
AA(AA const& aa)
{
printf("COPY!\n");
}
AA(int v)
{
printf("CTOR!\n");
}
};
int main(int argc, const char * argv[])
{
AA::test(AA(77));
return 0;
}
我试图通过value
as T&
, T const&
, T&&
, T const&&
,但它仍然复制。我预计优化器会消除函数框架,因此可以将函数参数推导出为 R 值,但我仍然看到COPY!
消息。
我也尝试过 C++11 转发模板,但我不能使用它,因为它不能是一个虚函数。
我的编译器是 Xcode 中包含的 Clang。(clang-425.0.28) 优化级别设置为-Os -flto
.
更新(供以后参考)
clang -Os -flto -S -emit-llvm -std=c++11 -stdlib=libc++ main.cpp;
我编写了额外的测试,并使用选项检查了生成的 LLVM IR 。我能观察到的是:(1)功能框架总是可以被消除的。(2)如果大对象(4096字节)按值传递,它没有被淘汰。(3) 通过 r 值引用 usingstd::move
效果很好。(4) 如果我不制作移动构造函数,编译器大多会退回到复制构造函数。