是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

2024-05-17

从 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(使用前将#替换为@)

是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数? 的相关文章

随机推荐