繁体   English   中英

此结构的生命周期和内存设置

[英]Lifetime and memory setup of this struct

以以下形式给出结构(在main()之前或之后声明)

struct
{
    ...
} bar;

我不知道该如何管理以及如何处理此类对象。

总的来说,我想对此做个360°的回答,但我也有几个问题:

  • 这是否等于声明static结构?
  • 在C ++ 11中合法和安全吗?
  • 如何通过引用访问栏?

对于最后一个,我在这里准备了一个小片段,该片段不起作用,但显示了我要实现的目标。

它是未命名结构的全局对象。 您不能将此类型用作函数的参数(因为您不知道对象的真实类型)。 您可以为此使用decltype,但由于它是全局对象,因此不需要。 这是合法和安全的。

#include <iostream>

struct
{
    double k1 =  0.123;
} bar;

int foo(decltype(bar)& a)
{
    return a.k1-1;
};

int main()
{
    std::cout << foo(bar) << std::endl;
    return(0);
}

确实,由于您只有此结构的一个全局对象-您只需使用

#include <iostream>

struct
{
    double k1 =  0.123;
} bar;

int foo()
{
    return bar.k1-1;
};

int main()
{
    std::cout << foo() << std::endl;
    return(0);
}

这只是一个全局变量 您可以从此编译单元中的任何函数或方法访问它。 声明它的正确方法(关于您的代码段)将是:

struct foo
{
    double k = 1.23;
};

foo bar;

现在,您可以像这样简单地通过引用传递它:

void f(foo & b)
{
    b.k = 34.5;
}

在您的代码段中,bar是类型为未命名结构的变量:

struct <unnamed>
{
    double k = 1.23;
} bar;

由于您没有为类型指定任何名称,因此无法以经典方式将其作为参数传递给函数。 C ++ 11允许您使用decltype指令执行此操作:

struct
{
    double k = 1.23;
} bar;

void f(decltype(bar) & b)
{
    b.k = 3.45;
}

至于您的问题:

  • 它与静态结构不同。 静态变量的行为略有不同。 静态类(=结构)也是如此。

  • 在C ++ 11中使用全局变量合法且安全的,但强烈建议不要使用它们,因为它们很容易破坏程序的逻辑或体系结构。 相反,应该使用静态类或单例。

static是存储属性。 struct与任何其他数据类型一样:它可以是staticvolatileautoextern and其他由某些实现定义的类型。

这是合法和安全的。

引用这样的结构:

struct {
     int   field1, field2;
     double  yada, yada2, yada3;
} bar1, bar2;

bar1.yada3 = 3.14159265358979;   // assign a field in the struct
bar2 = bar1;   // copy contents of bar1 to bar2

1> bar只是其类型的单个实例。 您不能有其他与bar类型相同的实例。 它的类型是未命名类型struct,就像匿名联合一样。 拥有一个这样的是合法的。 它更像是全局静态的(但不是静态的),只是因为您不能通过其他文件中的extern关键字来引用它。任何黑客您都必须在其他文件中引用它...?

3>拥有它是合法的。

4>您不能声明对您不知道类型的变量的引用。 尽管您可以在文件中的任何位置访问/修改同一对象,所以无需引用。 引用主要用于从代码中删除*和->,否则引用完全可以通过指针进行。

这是否等于声明static结构?

不,您可以像其他任何static变量一样使用static关键字。 它声明一个全局变量,即具有静态存储持续时间和外部链接,等效于:

struct Bar {...};
Bar bar;

在C ++ 11中合法和安全吗?

是。

如何通过引用访问栏?

由于类型没有名称,因此必须通过模板参数推导或在C ++ 11中进行推断:

auto & ref = bar;

template <typename Bar> void bar_by_ref(Bar & bar) { 
    /* do something with bar */ 
}

另外,在C ++ 11中,可以通过decltype提取类型:

decltype(bar) & ref = bar;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM