将属性置于受保护/私有的任何性能原因?

Posted

技术标签:

【中文标题】将属性置于受保护/私有的任何性能原因?【英文标题】:Any performance reason to put attributes protected/private? 【发布时间】:2011-03-09 14:11:47 【问题描述】:

我在学校“学习”了 C++,但有几件事我不知道,比如编译器可以优化的地方或内容,似乎我已经知道 inlineconst 可以提升一点......

如果性能很重要(例如游戏编程),是否放置类属性而不是 publicprivateprotected)允许编译器生成更优化的代码?

因为我以前的老师都说它更“安全”或“防止不想要或授权的班级访问/行为”,但最后,我想知道是否将属性设置为不是 public 可以限制范围和从而固定东西。

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

【问题讨论】:

const 不太可能提升任何东西。而且内联一般是没用的。 @Alexandre:这种笼统的说法肯定不是真的。 const 很可能能够提高性能。非常量 int 表达式不能是整型常量表达式,但 const int 可以。 @Alexandre:inline 的目的是允许在多个编译单元中定义函数,因此如果编译器选择内联,则定义可用。是否影响编译器内联函数的决定取决于编译器。 @Mike:确实,优化没用。 【参考方案1】:

没有。将成员设为私有或受保护不会提供任何性能优势;当然,对您的设计(信息隐藏)的好处是巨大的。

【讨论】:

我不明白,这是什么好处?对于将阅读我的代码的其他人?因为对我来说,如果我知道自己在编程什么,我真的看不到任何好处,而且我不明白是什么让它的设计如此出色。 @gokoon:有关信息隐藏的好处的讨论,请参见 Wikipedia,例如:en.wikipedia.org/wiki/Information_hiding 即使您自己编程,IH 也是有益的,因为它更容易推理你的类的行为:如果它是私有的,只有类本身可以改变它——如果它是公共的,它可以从任何地方改变。随着项目规模的扩大,这一点变得越来越重要。 @gokoon:信息隐藏非常棒,因为当您需要进行更改时。假设您有 100,000 行代码,并且您想更改 Database::connect() 的实现方式。您可以更改和修改 Database 类中的所有私有数据和函数,并且您永远不需要查看 Database::connect() 的调用者如何使用它。【参考方案2】:

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

但是,要直接回答您的问题:范围的任何缩小都可能有助于编译器进行某些优化,我想不出任何关于使成员私有的问题。

【讨论】:

我不会说他们使用protected hide 实现是正确的...只是因为它没有。将数据暴露给派生类相当于将其设为publicprotected 只对某些方法有价值。 当然,您总是可以从某个类继承只是为了访问它的受保护字段(我假设您的意思是受保护的不隐藏实现)。但这就像争论 C++ 中的 const 修饰符不会使值变为 const,因为您始终可以 const_cast 一个值并随意修改它。 C++ 访问控制被描述为“防止墨菲,而不是马基雅维利”。他们记录他们的意图,通常防止意外违规,但不会阻止确定的滥用。【参考方案3】:

一旦你的代码编译完成,就没有publicprivateprotected这样的东西,所以它不会影响性能。

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

inline 很少有任何效果。这只是对编译器的一个建议,编译器可以随意忽略(并且经常忽略)。编译器会在它认为合适的时候内联函数。

【讨论】:

"在某些情况下" = 几乎从不,因为 const 变量可以有别名,这很难证明相反。 如果你有const int a=1, b=2; int c=a+b; a+b 表达式将在编译时进行评估。我同意这种情况很少见,但它确实经常发生,足以引起注意。 @Alexandre:修改常量对象会产生未定义的行为,因此编译器不需要证明它不能被修改。 “在机器代码中也没有 const 这样的东西” - 也许不是,但在大多数平台上,命名空间范围内的文字和常量对象最终将位于只读内存区域,这将捕获任何修改它们的尝试。 你自相矛盾。你说编译代码中没有访问修饰符,因此它们不会影响性能,但接着说编译代码中也没有 const,但是编译器可以优化。第一条语句当然是错误的,因为编译后的代码中没有留下任何类型信息,但是由于编译时可用的类型信息,编译器可以进行大量优化。

以上是关于将属性置于受保护/私有的任何性能原因?的主要内容,如果未能解决你的问题,请参考以下文章

检查和编辑对象的私有/受保护属性

有没有办法使用反射类设置私有/受保护的静态属性?

对字段和方法使用私有而不是受保护的原因

向某些类公开受保护/私有属性

为啥同一类而不是同一对象可以访问受保护和私有属性?

php属性u存在受保护或私有属性的修复程序