C ++ const-correctness和const成员

时间:2012-03-07 09:26:30

标签: c++ const compiler-optimization const-correctness construction

  

可能重复:
  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 *聚合并在变更时重建对象而不是使用赋值运算符?

感谢您的一些快速评论!

2 个答案:

答案 0 :(得分:2)

SO以及HERE

查看相关信息

答案 1 :(得分:1)

首先,关于词汇的说明:根据定义,实体对象具有 身份,所以不支持任务。我想你的意思是 价值对象。

否则:我通常发现制作数据的优势很小 成员const。正如你所注意到的那样,这样做是不可能的, 这意味着它们不能是值类型的const。对于实体 对象,无法分配,有一些价值 不可变成员(例如标识符)const,但是所有访问都在 你控制的一小段代码,价值相当低 而不是公共界面中的const

另一种可能性是为这些成员定义不可变类型。它的 将name定义为Identifier比将其表达得更具表现力 将其定义为std::stringIdentifier,即使它包含在内 只有一个类型为std::string的数据成员会限制您的内容 可以做到这一点。 (这也有助于改变代表性 之后的标识符。)