2

我想知道,如果我使用 static_cast 而不是让编译器找出是否可以强制转换对象并自行执行,它是否会花费更少的编译时间?大约。我正在讲述 3000 行 c++ 代码。例如:

stack< const something*> myStack;
// ...
myStack.push(/* not const */ something*) 

对比

stack< const something*> myStack;
// ...
myStack.push(static_cast< const something*>(something*)). 

我在大学里学过 ada 语言,从那以后我有点困惑是应该进行强制转换还是让编译器来做。

4

2 回答 2

1

这里static_cast<>没有必要,因为正如您所猜测的,编译器将自己执行限定转换。

它只会使您的(有效)代码不必要地难以阅读,所以我不会使用它。当我阅读 astatic_cast<>时,我预计会发生一些相关的事情,这需要演员表,需要我注意的事情,并要求我去弄清楚发生了什么以及为什么。这就像一个假警报。

更喜欢使您的代码易于阅读和清洁

而且,如果您对编译时间有疑问,我个人不会为这种微优化而烦恼-它们也可能会增加编译时间(毕竟,编译器static_cast首先需要检查是否合法)。相反,请考虑您是否不能重新考虑类的设计以及它们之间的依赖关系——尽管不能在没有看到它们的情况下给出具体的建议。

于 2013-04-13T12:21:42.710 回答
0

不,它不会节省编译时间。

要找出原因,请考虑:

auto i = /* some expr */;

相对:

int i = /* some expr */;

在这两种情况下,编译器需要做的第一件事就是计算some expr. 然后,在这种auto情况下,它会简单地认为基类型是 of i,而在第二种情况下,如果基类型不是int,它将检查是否存在有效的转换。

同样的事情发生在您的情况下,无论您是否明确指定类型,编译器都必须计算表达式的类型,并且必须检查是否允许发生的转换(无论是否隐式)。

因此,您并没有提供帮助,而且您将代码弄得杂乱无章,从而降低了您自己和您的同事的可读性。

于 2013-04-13T12:32:07.067 回答