C++/CLI中的值类

man*_*hah 10 c++ c++-cli managed

在C++/CLI中使用值类有什么好处.值类包含成员函数吗?

Bot*_*000 15

a value class是a ValueType- 这意味着,无论何时将其分配给同一类型的另一个变量,整个对象都会被复制到另一个变量中,从而为您留下两个单独的副本.这方面的例子是基本的数字数据类型,如int,booldouble.ValueTypes密封,这意味着你不能从他们那里得到.

A ref class是引用类型 - 如果将其分配给同一类型的另一个变量,则只复制引用.所以这两个变量基本上"指向"相同的数据.

所以value class和之间的主要区别ref class是复制语义.两者都可以包含方法,字段属性等.此外,你不能从一个value class.

在此上下文中使用classstruct关键字之间的区别在于成员的默认可见性.这是private为了ref/value classpublicref/value struct.

一个常见的误解是value/ref指定存储位置(value = stack,ref = heap).每个对象的存储位置,无论是ValueType还是引用类型,都是没有人应该依赖或做出假设的实现细节,并且完全由运行时自行决定哪个存储位置适合于任何给定的上下文.

  • 这是因为ValueTypes是密封的,根据CLI规范"以避免处理值切片的复杂性".更新了我的回答. (2认同)
  • "value = stack"不是一个实现细节,它只是*错*. (2认同)
  • 好吧,局部变量可以进入堆栈,如果它们是值类型,那么堆栈上会有一个值类型.但是成员变量会进入其他对象,因此作为引用类型成员的值类型最终会出现在GC堆上.除非它最终在大对象堆上.数组元素也存储在其中一个堆上,捕获的局部变量(当涉及匿名委托和lambdas时).因此,值类型等同于堆栈上的存储的想法是错误的. (2认同)