gpt4 book ai didi

c# - 是否有任何 C++11 emplace/emplace_back 函数的 C# 模拟?

转载 作者:可可西里 更新时间:2023-11-01 09:11:37 32 4
gpt4 key购买 nike

从 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");

对于容器类 (System.Collections.Generic.List),是否有任何 C++ 函数的 C# 类似物,如 emplaceemplace_back?/p>

更新:在 C# 中,类似的代码可能写成 list.EmplaceBack(1, "t"); 而不是 list.Add(new S(1, "t")); .每次在这种情况下,最好不要记住类名并编写 new ClassName

最佳答案

一般来说,C# 中没有类似的东西,而且它的需要比 C++ 中少得多。

在 C# 中,当你有一个 List<SomeReferenceType>你真正拥有的是 List<ReferenceToSomeType> ,因此是一个引用列表,每个元素的大小为 4 或 8 个字节(参见 How big is an object reference in .NET? )。复制引用不会导致底层对象被复制,所以它非常快(你正在复制大约 4 或 8 个字节,并且处理器针对此操作进行了优化,因为这是处理器 native 指针的大小).所以当你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 (最后只使用了放置构造函数)。

关于c# - 是否有任何 C++11 emplace/emplace_back 函数的 C# 模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35985797/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com