从 C++11 开始,可以写类似的东西
#include <vector>
#include <string>
struct S
{
S(int x, const std::string& s)
: x(x)
, s(s)
{
}
int x;
std::string s;
};
// ...
std::vector<S> v;
// add new object to the vector v
// only parameters of added object's constructor are passed to the function
v.emplace_back(1, "t");
是否有 C# 类似的 C++ 函数,例如emplace
or emplace_back
对于容器类(System.Collections.Generic.List
)?
Update:在 C# 中,类似的代码可以写为list.EmplaceBack(1, "t");
代替list.Add(new S(1, "t"));
。最好不要记住类名并写new ClassName
每次都会遇到这样的情况。
一般来说,C# 中没有类似的东西,而且它的需求比 C++ 少得多。
在 C# 中,当你有List<SomeReferenceType>
你真正拥有的是List<ReferenceToSomeType>
,因此是一个引用列表,每个元素的大小为 4 或 8 字节(请参阅.NET 中的对象引用有多大? https://stackoverflow.com/questions/3800882/how-big-is-an-object-reference-in-net)。复制引用不会导致底层对象被复制,因此速度非常快(您正在复制大约 4 或 8 个字节,并且处理器针对此操作进行了优化,因为这是处理器本机指针的大小)。所以当你someList.Add(someReference)
你正在做的是添加对你的引用List<>
.
在 C++ 中,当你有std::vector<SomeType>
你所拥有的是一个向量SomeType
,每个元素的大小等于sizeof(SomeType)
。插入一个新元素std::vector<>
将导致您插入的元素被重复(克隆、复制...选择您喜欢的动词)。这是一项昂贵的操作。
通常,您使用的模式是创建一个对象只是为了将其插入到std::vector<>
。为了在 C++11 中优化此操作,他们添加了两种方法:std::vector<>::emplace
方法和支持std::vector<>
的移动语义。不同之处在于移动语义必须由SomeType
类型(你需要一个移动构造函数noexcept
说明符),而每种类型都支持emplace
(最后只是使用了放置构造函数)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)