此代码更改有什么用途
What purpose does this code change serve?
我正在努力理解某人最近进行的代码更改的含义/副作用/优点。变化如下:
原始
static List<type1> Data;
修改
static List<type1> & getData (void)
{
static List<type1> * iList = new List<type1>;
return * iList;
}
#define Data getData()
这种改变有什么作用?
我看到的修订版的好处是"初始化时间"问题。
旧代码在调用main()
之前触发了初始化。
新代码直到第一次调用getData()
才触发初始化;如果从未调用过该函数,则永远不会为初始化未使用的变量付费。(次要的)缺点是,每次使用函数时,都会在生成的代码中进行初始化检查,每次需要访问数据列表时都会调用函数。
如果您有一个具有静态持续时间的变量,那么它将在初始化应用程序时创建。当应用程序终止时,对象将被销毁。无法控制创建不同对象的顺序。
该更改将使对象在首次使用时创建,并且(由于它是动态分配的)它永远不会被销毁。
如果其他对象在被销毁时需要这些对象,这可能是一件好事。
更新
原始代码使用变量Data
访问该对象。新代码不必以任何方式进行修改。当代码使用Data
时,实际上它将使用宏Data
,该宏将扩展为getData()
。此函数将返回对实际(动态分配的对象)的引用。在实践中,新代码将作为旧代码的替代品,唯一值得注意的区别是我在上面的原始答案中描述的。
将构建延迟到首次使用Data
,避免了"静态初始化顺序失败"。
对你的List
进行一些猜测,。。。默认构造的Data
可能是type1
项目的空列表,因此它可能不会有导致所讨论的惨败的很大风险。但也许有人觉得安全总比后悔好。
进行更改的原因有几个:
- 防止静态订单初始化失败
- 延迟静态变量的初始化(无论出于何种原因)
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 0-1背包代码中的错误.我的代码中有什么错误
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 这行代码在C++类中意味着什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 此代码中的操作流程是什么?C/C++.
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 此代码验证公式是什么意思?
- 这是什么代码?为什么它有效?C++
- 当您希望在Arduino Uno编程中同时执行不同函数时,使用什么代码/语句
- 这是什么代码?C或C
- 在 c++ 中应该使用什么代码而不是 getche
- 什么代码更适合用于运算符重载
- 什么代码可以使这个循环工作