C++ 此结构的生存期和内存设置

C++ 此结构的生存期和内存设置,c++,memory-management,c++11,struct,C++,Memory Management,C++11,Struct,给定表单中的结构(在main()之前或之后声明) 我不知道如何管理这件事,如何对待这类对象 总的来说,我希望得到360°的答案,但我也有几个问题: 这是否等同于声明一个静态结构 它在C++11中是合法和安全的 如何通过引用访问bar 对于最后一个,我准备了一个小片段,它不起作用,但显示了我试图实现的目标。它是未命名结构的全局对象。您不能将此类型用作函数的参数(因为您不知道对象的实际类型)。您可以为此使用decltype,但不需要它,因为它是全局对象。这是合法和安全的 #include <

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

我不知道如何管理这件事,如何对待这类对象

总的来说,我希望得到360°的答案,但我也有几个问题:

  • 这是否等同于声明一个
    静态
    结构
  • 它在C++11中是合法和安全的
  • 如何通过引用访问bar

对于最后一个,我准备了一个小片段,它不起作用,但显示了我试图实现的目标。

它是未命名结构的全局对象。您不能将此类型用作函数的参数(因为您不知道对象的实际类型)。您可以为此使用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);
}
#包括
结构
{
双k1=0.123;
}酒吧;
int foo(数据类型(条形)和a)
{
返回a.k1-1;
};
int main()
{

std::cout它是未命名结构的全局对象。您不能将此类型用作函数的参数(因为您不知道对象的真实类型)。您可以使用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);
}
#包括
结构
{
双k1=0.123;
}酒吧;
int foo(数据类型(条形)和a)
{
返回a.k1-1;
};
int main()
{
std::cout这只是一个全局变量。您可以从此编译单元中的任何函数或方法访问它。声明它的正确方法(关于您的代码段)是:

struct foo
{
    double k = 1.23;
};

foo bar;
现在,您只需按如下方式通过引用传递它:

void f(foo & b)
{
    b.k = 34.5;
}
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
在代码段中,bar是一个类型为未命名结构的变量:

struct <unnamed>
{
    double k = 1.23;
} bar;
关于你的问题:

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

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

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

      struct foo
      {
          double k = 1.23;
      };
      
      foo bar;
      
      现在,您只需按如下方式通过引用传递它:

      void f(foo & b)
      {
          b.k = 34.5;
      }
      
      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
      
      在代码段中,bar是一个类型为未命名结构的变量:

      struct <unnamed>
      {
          double k = 1.23;
      } bar;
      
      关于你的问题:

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

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


      • 否。
        静态
        是一个存储属性。
        结构
        类似于任何其他数据类型:它可以是静态
易失性
自动
外部
和一些实现定义的其他数据类型

这是合法和安全的

#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);
}
参考这样的结构:

void f(foo & b)
{
    b.k = 34.5;
}
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

不。
静态
是一个存储属性。
结构
类似于任何其他数据类型:它可以是
静态
易失性
自动
外部
和一些实现定义的其他数据类型

这是合法和安全的

#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);
}
参考这样的结构:

void f(foo & b)
{
    b.k = 34.5;
}
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相同类型的另一个实例。其类型是未命名类型结构,就像匿名联合一样。拥有这样一个实例是合法的。它更像全局静态的(但不是静态的)只是因为你不能在其他文件中通过
extern
关键字引用它。任何黑客攻击都必须在其他文件中引用它

3> 拥有它是合法的


4> 您不能声明对未知类型变量的引用。尽管您可以访问/修改文件中的任何位置的同一对象,因此无需引用。引用主要用于从代码中删除*和->,否则引用所做的一切都可以通过指针来实现。

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

3> 拥有它是合法的

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

这是否等同于声明一个
静态
结构

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

struct Bar {...};
Bar bar;
它在C++11中是合法和安全的

如何通过引用访问bar

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

auto & ref = bar;

template <typename Bar> void bar_by_ref(Bar & bar) { 
    /* do something with bar */ 
}
这是否等同于声明一个
静态
结构

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

struct Bar {...};
Bar bar;
它在C++11中是合法和安全的

如何通过引用访问bar

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

auto & ref = bar;

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

如果不使用decltype怎么办?C++11标准确实没有提供匿名结构?@user2384250您不知道真正的类型。编译器知道。decltype