我有一个需要了解一些大型数据结构的类。因此,我创建了一个构造函数,它接受对该大型数据结构的引用,并使用它来初始化一个成员变量,如下所示:
class Foo {
public:
BigStruct m_bigstruct;
Foo(BigStruct &inBigStruct) : m_bigstruct(inBigStruct) {}
};
这似乎是inBigStruct
的副本,但我不想浪费这些资源,因为BigStruct
是巨大的。是否有更标准的方法使inBigStruct
的内容可供Foo使用而不复制它?我知道我可以这样做:
class Foo {
public:
BigStruct* m_bigstruct;
Foo(BigStruct* inBigStruct) : m_bigstruct(inBigStruct) {}
};
这是inBigStruct
无需复制即可使用Foo
的常用方法吗?如果不是,那是什么?
答案 0 :(得分:3)
C ++ 2011方法是移动对象,例如:
Foo::Foo(BigStruct const& argument): m_bigstruct(argument) {} // copies
Foo::Foo(BigStruct&& argument): m_bigstruct(std::move(argument)) {} // moves
当然,这假设BigStruct
有一个合适的移动构造函数。根据是否传递临时(或通过std::move()
看起来像临时的东西)或左值,对象将被移动或复制:如果您有另一个对象的引用,您通常不希望窃取对象但复制它。
答案 1 :(得分:2)
如果您确定在Foo活着时它不会失效,您可以存储参考。
class Foo {
public:
/*const*/ BigStruct& m_bigstruct;
Foo(BigStruct &inBigStruct) : m_bigstruct(inBigStruct) {}
};