我想了解影响/副作用/优点最近的代码更改有人作出。变化如下:此代码更改有什么用途?
原始
static List<type1> Data;
修改
static List<type1> & getData (void)
{
static List<type1> * iList = new List<type1>;
return * iList;
}
#define Data getData()
什么目的,可以在变更服务?
我想了解影响/副作用/优点最近的代码更改有人作出。变化如下:此代码更改有什么用途?
原始
static List<type1> Data;
修改
static List<type1> & getData (void)
{
static List<type1> * iList = new List<type1>;
return * iList;
}
#define Data getData()
什么目的,可以在变更服务?
我可以看到修订的好处是'初始化时间'的问题。
在调用main()
之前,旧代码触发了初始化。
直到第一次调用getData()
时,新代码才会触发初始化;如果该函数从未被调用过,那么您从来不会花钱来初始化您没有使用的变量。 (次要的)缺点是每次使用函数时都会在生成的代码中进行初始化检查,并且每次需要访问数据列表时都会有一个函数调用。
初始化后的值生命周期如何?那会是一样的吗? – Lazer 2012-01-14 20:38:52
一旦初始化,它将永远持续(直到程序终止)。我相信,如果该计划退出控制,它应该被彻底销毁。 (哦,但是它是动态分配的;当程序退出时它可能只是'泄漏'了吗?这种'泄漏'是非常无害的,除非列表中的数据类型获取需要在程序退出时正式发布的资源。 ) – 2012-01-14 20:39:50
@拉泽尔:是的。寿命与原始代码的情况相同。 – 2012-01-14 20:40:46
如果您有一个具有静态持续时间的变量,它将在应用程序初始化时创建。当应用程序终止时,对象被销毁。无法控制创建不同对象的顺序。
更改将使对象在第一次使用时被创建,并且(因为它是动态分配的)它永远不会被销毁。
如果其他对象在销毁时需要这个对象,这可能是件好事。
更新
原代码使用可变Data
访问的对象。新代码不必以任何方式修改。当代码使用Data
时,它实际上会使用宏Data
,它将被扩展为getData()
。该函数将返回对实际(动态分配的对象)的引用。实际上,新代码将作为旧代码的直接替代品,唯一明显的区别在于我在上面的原始答案中所描述的内容。
是的,物体不会被破坏,但它将如何被访问? – Lazer 2012-01-14 20:45:36
只要有人调用Lazer,getData就会被访问。 – 2012-01-14 20:49:04
延期施工,直到Data
的第一次使用避开“static initialization order fiasco”。
制作的一些猜测你的List
,......的默认构造Data
大概是type1
项目列表为空,所以它可能不是在问题导致惨败的巨大风险。但也许有人觉得安全而不是抱歉比较好。
为什么有这种变化是由几个原因:
也许避免某种静态初始化问题? – Anycorn 2012-01-14 20:37:11
'#定义数据...'只是要求麻烦 – tenfour 2012-01-14 20:42:24
@ Lol4t0:请您解释一下关于您的评论的更多信息?它如何不是线程安全的? – Lazer 2012-01-14 20:43:45