可能重复:
Does const-correctness give the compiler more room for optimization?
在过去的几周里,如果可能的话,我已经开发了一个用于制作所有非静态成员const
的东西,以避免意外的编程错误。然而,这种做法提供了一些巨大的缺点,特别是对于实体对象,例如,如果他们选择直接聚合这样的实体对象而不是使用指针,那么任何人都不能再调用赋值运算符。
我的问题是这个const
成员哲学是否提供任何编译器优化奖金。
class User {
public:
User(const std::string &, const std::vector<unsigned char> &);
~User();
const std::string &getName() const;
const std::vector<unsigned char> &getPasswordHash() const;
private:
std::string name;
std::vector<unsigned char> passwordHash;
};
如果此class
'成员是const
,它会为我的编译器提供任何重要的优化可能性吗?鉴于其他类通常通常会聚合非常量User
对象,但几乎所有算法都会接受const User &
?
const
成员是否提供了比现有const User &
心态更重要的优化机会?是否有理由使用const User *
聚合并在变更时重建对象而不是使用赋值运算符?
感谢您的一些快速评论!
答案 0 :(得分:2)
答案 1 :(得分:1)
首先,关于词汇的说明:根据定义,实体对象具有 身份,所以不支持任务。我想你的意思是 价值对象。
否则:我通常发现制作数据的优势很小
成员const。正如你所注意到的那样,这样做是不可能的,
这意味着它们不能是值类型的const。对于实体
对象,无法分配,有一些价值
不可变成员(例如标识符)const,但是所有访问都在
你控制的一小段代码,价值相当低
而不是公共界面中的const
。
另一种可能性是为这些成员定义不可变类型。它的
将name
定义为Identifier
比将其表达得更具表现力
将其定义为std::string
和Identifier
,即使它包含在内
只有一个类型为std::string
的数据成员会限制您的内容
可以做到这一点。 (这也有助于改变代表性
之后的标识符。)