C ++ / Cli堆栈语义和跟踪参考运算符

时间:2017-04-05 09:13:46

标签: c++-cli

这两个定义之间有什么区别:

using namespace System;

String^ ToStringA(char* str)
{
    return gcnew String(str);
}

String^ ToStringB(char* str)
{
    return %String(str);
}

我的猜测是在后者中使用“堆栈语义”创建System::String以使用% - 运算符返回对该对象的引用,因此它与前者完全相同。真的吗?任何细微之处?

gcnew - 方式在这里可能更清晰,因此更受欢迎,但以下内容如何:

String^ ToString2A(char* str1, char* str2)
{
    return gcnew String(str1) + gcnew String(str2);
}

String^ ToString2B(char* str1, char* str2)
{
    return %String(str1) + %String(str2);
}

可以进行任何其他处理而不仅仅是连接。有什么理由不使用%

奖金问题:为什么the docs表示String没有堆栈语义,这甚至可以正常工作?

1 个答案:

答案 0 :(得分:2)

堆栈语义是纯粹的编译器功能,它在生成的MSIL中完全消失。编译器自动生成所需的gcnew以创建String对象。并且通常会自动生成Dispose()调用,但在这种情况下不会,因为String类型不实现IDisposable。

您只需要%运算符来保持编译器满意,它实际上不会产生任何代码。自动生成的String对象已经是引用类型。

因此两个片段完全相同并生成完全相同的MSIL。你可以通过像ildasm这样的反编译器来查看它。

支持最具可读性和逻辑性的版本。肯定是第一个,在非一次性类型上使用堆栈语义是没有意义的,只会混淆任何读取代码的人的填充。但这取决于你。