1

可能重复:
Does const-correctness give the compiler more room for optimization?C++常量,正确性和const成员

在过去的几个星期,我已经开发出一种东西让我的所有非静态成员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?鉴于其他类通常会聚合非常量对象,但几乎所有算法都会接受const User &

那么const成员是否会对已存在的const User &思路提供任何显着的优化机会?是否有理由使用const User *聚合并重构对象而不是使用赋值运算符?

感谢您的快速评论!

+0

重复。请记住,您不是使用const来加快速度,而是通过声明intente来减少程序中的错误机会。 – 2012-03-07 09:34:14

回答

2

SO退房它也HERE

+0

我的不好,抱歉。完美地回答问题。 – 2012-03-07 09:46:06

+0

哦,好的,谢谢! – 2012-03-07 09:47:48

1

首先,词汇记:实体对象,顾名思义,有 身份,因此不支持分配。我认为你的意思是 值对象。

否则:我一般发现在使数据 成员为const时没有什么优势。正如你已经注意到的那样,这样做使得不可能进行赋值, 这意味着它们不能是值类型的常量。对于无法分配的实体 对象,在创建 不可变成员(例如标识符)const时存在一些价值,但是由于所有访问均在 中,因此您控制的是一小块代码,值相当小 比公共界面中的const要多。

另一种可能性是为这些成员定义不可变类型。这是 更表现来定义nameIdentifier比它 将其定义为std::string,并且Identifier,即使它包含 只有一个数据成员与std::string类型会限制你 可以用它做什么。 (这也将有助于稍后更改标识符的表示 。)