混合使用指针和非指针对象时,对象的初始化顺序是什么?
In what order are objects initialized when mixing pointers and non-pointer objects?
取以下代码:
Foo *foo = fooFactory();
Bar bar(foo);
我有三个问题:
- 这里安全吗?换句话说,我是否保证在
Bar
的构造函数是 运行 之前调用 fooFactory()
并初始化 foo
(假设 fooFactory()
不抛出) ?
- 如果这是函数的一部分、class 的一部分,或者只是任何块外的裸声明,问题 1 的答案会改变吗?
- 如果
Bar
的构造函数实际上没有采用 Foo
指针,而是直接引用 foo
变量,答案会改变吗?
感谢您的宝贵时间。
- 是的,它很安全并且可以按预期工作
- 不,顺序没有改变。它只能在构造函数中的成员初始值设定项列表中更改(但这是不同的语法)。
- 不,这也不会改变答案。
在 C++(和 C)中,语句按照它们在源代码中出现的顺序执行(或看似执行)。在as-if规则下,为了提高性能,当语句B对语句A没有依赖时,可能会出现乱序执行。因此,给定:
int i = 1;
int j = 2;
int k = i + j;
前两个语句可能会乱序执行,但第三个绝不能。 (当然,在现实生活中,像这样的简单语句经常被优化掉,但你懂的)。
因此,在您发布的代码中,第二个语句使用第一个语句的结果,因此语句将按顺序执行。
取以下代码:
Foo *foo = fooFactory();
Bar bar(foo);
我有三个问题:
- 这里安全吗?换句话说,我是否保证在
Bar
的构造函数是 运行 之前调用fooFactory()
并初始化foo
(假设fooFactory()
不抛出) ? - 如果这是函数的一部分、class 的一部分,或者只是任何块外的裸声明,问题 1 的答案会改变吗?
- 如果
Bar
的构造函数实际上没有采用Foo
指针,而是直接引用foo
变量,答案会改变吗?
感谢您的宝贵时间。
- 是的,它很安全并且可以按预期工作
- 不,顺序没有改变。它只能在构造函数中的成员初始值设定项列表中更改(但这是不同的语法)。
- 不,这也不会改变答案。
在 C++(和 C)中,语句按照它们在源代码中出现的顺序执行(或看似执行)。在as-if规则下,为了提高性能,当语句B对语句A没有依赖时,可能会出现乱序执行。因此,给定:
int i = 1;
int j = 2;
int k = i + j;
前两个语句可能会乱序执行,但第三个绝不能。 (当然,在现实生活中,像这样的简单语句经常被优化掉,但你懂的)。
因此,在您发布的代码中,第二个语句使用第一个语句的结果,因此语句将按顺序执行。