是否有性能原因将属性设置为受保护/私有? 我在学校里学会了C++,但是有几件事我不知道,比如编译器在哪里或者什么地方可以优化,我已经知道了内联和 const 可以稍微提高……/P>

是否有性能原因将属性设置为受保护/私有? 我在学校里学会了C++,但是有几件事我不知道,比如编译器在哪里或者什么地方可以优化,我已经知道了内联和 const 可以稍微提高……/P>,c++,class,private,public,protected,C++,Class,Private,Public,Protected,如果性能很重要(例如游戏编程),那么将类属性设置为非public(private或protected)是否允许编译器生成更优化的代码 因为我以前的老师都说它更“安全”或“防止不想要或未授权的类访问/行为”,但最后,我想知道,是否将属性notpublic可以限制范围,从而使事情更安全 我不批评我的老师(我应该批评),但我上的编程课不是很高级…不。将成员私有化或受保护不会带来任何性能好处;当然,您的设计(信息隐藏)的好处是巨大的。老师们告诉您使用private和protected来隐藏实现,并教您有

如果性能很重要(例如游戏编程),那么将类属性设置为非
public
private
protected
)是否允许编译器生成更优化的代码

因为我以前的老师都说它更“安全”或“防止不想要或未授权的类访问/行为”,但最后,我想知道,是否将属性not
public
可以限制范围,从而使事情更安全


我不批评我的老师(我应该批评),但我上的编程课不是很高级…

不。将成员私有化或受保护不会带来任何性能好处;当然,您的设计(信息隐藏)的好处是巨大的。

老师们告诉您使用private和protected来隐藏实现,并教您有关信息隐藏的知识,而不是支持有问题的性能优化,这是正确的。首先考虑适当的设计,其次考虑性能,在99%的情况下,这将是更好的选择(即使在性能关键的场景中)。性能瓶颈可能会出现在许多不可预测的情况下,如果您的设计是合理的,则更容易出现


然而,为了直接回答您的问题:任何范围的缩小都可能有助于编译器进行某些优化,从我的头脑中,我现在想不出任何关于使成员私有化的方法。

一旦您的代码被编译,就没有所谓的
public
private
protected
,因此,它不会影响性能


在机器代码中也没有
const
(除了ROM),但是编译器可以通过知道某个值是否可以更改(在某些情况下)来对程序进行一些逻辑优化


inline
很少有任何效果。它只是给编译器的一个建议,编译器可以随意忽略(而且经常忽略)。编译器将根据需要内联函数。

const不太可能提高任何性能。内联通常是无用的。@Alexandre:这样一个笼统的语句肯定是不正确的。
const
很有可能提高性能。非常量int表达式不能是整型常量表达式,但
const int
可以。@Alexandre:
inline
的目的是允许在多个编译单元中定义函数,因此如果编译器选择将其内联,则定义可用。它是否会影响编译器内联函数的决定取决于编译器。@Mike:的确,这在优化方面是无用的。“在某些情况下”=实际上永远不会,因为常量变量可能有别名,这很难证明相反。如果你有
const int a=1,b=2;INTC=a+b将在编译时计算
a+b
表达式。我同意这种情况很少见,但这种情况确实经常发生。@Alexandre:修改常量对象会产生未定义的行为,因此编译器不需要证明它不能被修改。“机器代码中也没有
const
之类的东西”-也许没有,但在大多数平台上,命名空间作用域中的文本和常量对象最终将位于只读内存区域中,这将捕获任何试图修改它们的尝试。你自相矛盾。您说编译代码中没有访问修饰符,因此它们不会影响性能,但接着又说编译代码中也没有常量,但编译器可以对其进行优化。第一条语句当然是错误的,因为在编译后的代码中没有任何类型信息,但是编译器可以进行大量优化,这要感谢编译时可用的类型信息。我不认为他们正确地教导使用
受保护的
隐藏实现。。。只是因为它没有。向派生类公开数据相当于将其公开<代码>受保护的
只对某些方法有价值。当然,您总是可以从某个类继承来访问其受保护的字段(我假设这就是您所说的受保护的不隐藏实现的意思)。但这就像在C++中的const修饰符不使值const一样,因为你总是可以const铸造一个值并随意修改它。C++访问控制被描述为“保护墨菲,而不是马基雅维利”。他们记录下他们的意图,通常防止意外违规,但不会阻止坚决的滥用。我不明白,这有什么好处?对于其他将阅读我的代码的人?因为对我来说,如果我知道我在编程什么,我真的看不到任何好处,我也不明白是什么让它的设计变得如此之好。@gokoon:关于信息隐藏的好处的讨论,请参阅Wikipedia,例如:即使你自己编程,IH也是有益的,因为这样可以更容易地对类的行为进行推理:如果它是私有的,只有类本身可以改变它——如果它是公共的,它可以从任何地方改变。随着项目规模的增加,这一点变得越来越重要。@gokoon:信息隐藏非常重要,因为您需要在何时进行更改。假设您有100000行代码,并且希望更改Database::connect()的实现方式。您可以更改和修改Database类中的所有私有数据和函数,并且不需要查看Database::connect()的调用方如何使用它。