我正在尝试了解最近有人做出的代码更改的含义 / 副作用 / 优势。变化如下:
原始
static List<type1> Data;
修饰
static List<type1> & getData (void)
{
static List<type1> * iList = new List<type1>;
return * iList;
}
#define Data getData()
改变的目的是什么?
答案 0 :(得分:4)
我可以看到修订的好处是“初始化时间”问题。
旧代码在调用main()
之前触发了初始化。
新代码在第一次调用getData()
之前不会触发初始化;如果从未调用该函数,则永远不会为初始化未使用的变量付费。 (次要的)缺点是每次使用该函数时都会在生成的代码中进行初始化检查,并且每次需要访问数据列表时都会进行函数调用。
答案 1 :(得分:3)
如果您有一个具有静态持续时间的变量,则会在初始化应用程序时创建该变量。当应用程序终止时,对象被销毁。无法控制创建不同对象的顺序。
更改将使对象在首次使用时创建,并且(因为它是动态分配的)它永远不会被销毁。
如果其他对象在被销毁时需要这个对象,这可能是一件好事。
更新
原始代码使用变量Data
访问对象。不必以任何方式修改新代码。当代码使用Data
时,它实际上将使用宏 Data
,它将扩展为getData()
。此函数将返回对实际(动态分配的对象)的引用。在实践中,新代码将作为旧代码的替代品,唯一明显的区别就是我在上面的原始答案中所描述的。
答案 2 :(得分:1)
在第一次使用Data
之前延迟构建会避免使用“static initialization order fiasco”。
对您的List
进行一些猜测,...默认构造的Data
可能是type1
项的空列表,因此可能不会导致惨败的风险很大有问题。但也许有人觉得安全比抱歉更好。
答案 3 :(得分:0)
有几个原因可以进行更改: