【发布时间】:2016-07-21 19:55:03
【问题描述】:
我最近开始使用 C# 进行 Unity(游戏引擎)开发。我注意到这与 C++ 不同; C# 要求我在使用其成员函数或变量之前在堆上实例化一个对象。与 C++ 一样,我可以声明一个对象并从声明名称调用任何函数。
C++ 示例:
#include <iostream>
using namespace std;
class SampleClass
{
void PrintFunc()
{
cout<<"Hello World"<<endl;
}
}
int main()
{
SampleClass objectC; //Object declaration
objectC.PrintFunc(); //Use of function without instantiation
//The above code will print'Hello World'
}
C# 示例:
using System
namespace ConsoleProject2
{
class MainClass
{
class SampleClass
{
Void PrintFunc()
{
Console.WriteLine("Hello World");
}
}
public static void Main (string[] args)
{
SampleClass objectC = new SampleClass();
//Must instantiate before accessing member functions
objectC.PrintFunc(); //Prints out 'Hello World'
}
}
}
在 Unity 的 Automatic Memory Management 网站上阅读时,我只能得出结论,由于它是自动垃圾收集,它可能需要您将新对象放在堆上,因为它会为您解除分配。 (可能是错误的假设,请纠正我)
为什么这两种语言在访问对象属性时会有所不同?由于没有实例化,C++ 中的对象是否被放置在堆栈上;如果是这样,为什么不将所有对象都放在堆栈上?
谢谢。
【问题讨论】:
-
因为它们是不同的语言,仅此而已。
-
您也在 c++ 代码中实例化一个对象。仅仅因为您没有明确调用
new并不意味着您没有创建对象。您正在使用 C++ 中的 自动存储持续时间 制作一个,并使用默认构造函数来执行此操作。 -
用unity3d没关系。
-
我认为主要问题是您将苹果(C++ 类)与橙子(C# 类)进行比较 - 更好的比较是 C++ 类与 C# 结构和 C++ 指向 C# 类的指针 - 每对的行为非常相似(我试图回答...)。
-
@jaggedSpire 这正是我的观点。自动存储持续时间将 C++ 对象放在堆栈上(因为在函数退出后将其删除);为什么我们不能在堆栈上放置一个 C# 对象?
标签: c# c++ memory memory-management