此代码更改的用途是什么?

时间:2012-01-14 20:32:27

标签: c++

我正在尝试了解最近有人做出的代码更改的含义 / 副作用 / 优势。变化如下:

原始

static List<type1> Data;

修饰

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

改变的目的是什么?

4 个答案:

答案 0 :(得分:4)

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

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

新代码在第一次调用getData()之前不会触发初始化;如果从未调用该函数,则永远不会为初始化未使用的变量付费。 (次要的)缺点是每次使用该函数时都会在生成的代码中进行初始化检查,并且每次需要访问数据列表时都会进行函数调用。

答案 1 :(得分:3)

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

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

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

更新

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

答案 2 :(得分:1)

在第一次使用Data之前延迟构建会避免使用“static initialization order fiasco”。

对您的List进行一些猜测,...默认构造的Data可能是type1项的空列表,因此可能不会导致惨败的风险很大有问题。但也许有人觉得安全比抱歉更好。

答案 3 :(得分:0)

有几个原因可以进行更改: