【问题标题】:Anonymous classes in c++c++中的匿名类
【发布时间】:2012-12-05 11:21:35
【问题描述】:

对于我的项目,我正在使用 C++ 中的匿名类,我想知道它们在内存中的分配位置。

我很确定会在堆上分配,但我想知道其他人是否有更详细的信息。

【问题讨论】:

  • 如何在堆上分配一个未命名的类?
  • 不在任何地方
  • 当然是匿名类型的对象和里面声明的变量!
  • @neagoegab:请参阅chill 的回答,了解如何直接在 C++11 中执行此操作。当然,在 C++03 中,您可以在堆上分配一个未命名类的对象,如果它是具有名称的某个对象的子对象。无法为new 指定未命名的类型。
  • @Steve Jessop,对不起,但是来自寒冷示例的那些不是匿名的。 C++ 不支持匿名结构/类。 C11 确实支持匿名。结构,例如struct T { int tag; union { float x; int n; }; };。另外,你怎么能分配一些你不能参考的东西?......这是一个讽刺的问题......

标签: c++ memory-management anonymous-class


【解决方案1】:

正如所指出的,不会分配到任何地方。 对象,它们是匿名类的实例,可以通过多种方式分配:

例如作为另一个对象的子对象:

struct S
{
  struct {
    int x, y;
  } p;
};

或与类定义一起

struct
{
  float x, y;
} p;

或使用decltype:

struct S
{
  struct {
    int x, y;
  } p;
};

void g (decltype (S::p)) {}

decltype (S::p) *f ()
{
  auto p = new decltype (S::p);
  g(*p);
  return p;
}

【讨论】:

    【解决方案2】:

    如果匿名类是另一个类或结构的一部分,那么它将与周围的类或结构一起分配,无论是在堆上还是在堆栈上。

    如果匿名类是全局变量,则与其他全局变量一起存储。

    如果匿名类是局部变量,它会与定义它的函数的其他局部变量一起存储在堆栈中。

    【讨论】:

    • 简而言之:如果对象的类有名称,则该对象所在的位置相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多