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