2012-01-14 61 views
6

我想了解影响/副作用/优点最近的代码更改有人作出。变化如下:此代码更改有什么用途?

原始

static List<type1> Data; 

修改

static List<type1> & getData (void) 
{ 
    static List<type1> * iList = new List<type1>; 
    return * iList; 
} 
#define Data getData() 

什么目的,可以在变更服务?

+0

也许避免某种静态初始化问题? – Anycorn 2012-01-14 20:37:11

+2

'#定义数据...'只是要求麻烦 – tenfour 2012-01-14 20:42:24

+0

@ Lol4t0:请您解释一下关于您的评论的更多信息?它如何不是线程安全的? – Lazer 2012-01-14 20:43:45

回答

4

我可以看到修订的好处是'初始化时间'的问题。

在调用main()之前,旧代码触发了初始化。

直到第一次调用getData()时,新代码才会触发初始化;如果该函数从未被调用过,那么您从来不会花钱来初始化您没有使用的变量。 (次要的)缺点是每次使用函数时都会在生成的代码中进行初始化检查,并且每次需要访问数据列表时都会有一个函数调用。

+0

初始化后的值生命周期如何?那会是一样的吗? – Lazer 2012-01-14 20:38:52

+0

一旦初始化,它将永远持续(直到程序终止)。我相信,如果该计划退出控制,它应该被彻底销毁。 (哦,但是它是动态分配的;当程序退出时它可能只是'泄漏'了吗?这种'泄漏'是非常无害的,除非列表中的数据类型获取需要在程序退出时正式发布的资源。 ) – 2012-01-14 20:39:50

+0

@拉泽尔:是的。寿命与原始代码的情况相同。 – 2012-01-14 20:40:46

3

如果您有一个具有静态持续时间的变量,它将在应用程序初始化时创建。当应用程序终止时,对象被销毁。无法控制创建不同对象的顺序。

更改将使对象在第一次使用时被创建,并且(因为它是动态分配的)它永远不会被销毁。

如果其他对象在销毁时需要这个对象,这可能是件好事。

更新

原代码使用可变Data访问的对象。新代码不必以任何方式修改。当代码使用Data时,它实际上会使用Data,它将被扩展为getData()。该函数将返回对实际(动态分配的对象)的引用。实际上,新代码将作为旧代码的直接替代品,唯一明显的区别在于我在上面的原始答案中所描述的内容。

+0

是的,物体不会被破坏,但它将如何被访问? – Lazer 2012-01-14 20:45:36

+0

只要有人调用Lazer,getData就会被访问。 – 2012-01-14 20:49:04

1

延期施工,直到Data的第一次使用避开“static initialization order fiasco”。

制作的一些猜测你的List,......的默认构造Data大概是type1项目列表为空,所以它可能不是在问题导致惨败的巨大风险。但也许有人觉得安全而不是抱歉比较好。