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

时间:2013-05-17 05:46:22

标签: c++ memory-management c++11 struct

给出表单中的结构(在main()之前或之后声明)

struct
{
    ...
} bar;

我不知道如何管理这个以及如何处理这种对象。

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

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

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

5 个答案:

答案 0 :(得分:3)

它是未命名结构的全局对象。您不能将此类型用作函数的参数(因为您不知道对象的实际类型)。你可以使用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);
}

example

真的,因为你只有一个这个结构的全局对象 - 你可以使用

#include <iostream>

struct
{
    double k1 =  0.123;
} bar;

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

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

答案 1 :(得分: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中使用全局变量是合法且安全的,但强烈建议使用它们,因为它们可能很容易破坏程序的逻辑或架构。相反,应该使用静态类或单例。

答案 2 :(得分:0)

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

合法且安全。

参考这样的结构:

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

答案 3 :(得分:0)

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

3&GT;拥有它是合法的。

4&GT;您不能声明对您不知道的类型的变量的引用。 。虽然你可以在文件的任何地方访问/修改同一个对象,所以不需要参考。引用用于删除*和 - &gt;从代码,主要,否则什么引用做,都是可能的指针。

答案 4 :(得分:0)

  

这相当于声明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;