此代码更改有什么用途

What purpose does this code change serve?

本文关键字:什么 代码      更新时间:2023-10-16

我正在努力理解某人最近进行的代码更改的含义/副作用/优点。变化如下:

原始

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项目的空列表,因此它可能不会有导致所讨论的惨败的很大风险。但也许有人觉得安全总比后悔好。

进行更改的原因有几个:

  • 防止静态订单初始化失败
  • 延迟静态变量的初始化(无论出于何种原因)