C++常量正确性和常量成员
C++ const-correctness and const members
可能重复:
常量正确性是否为编译器提供了更多的优化空间?
在过去的几周里,我开发了一种方法,如果可能的话,让我的所有非静态成员成为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 User &
心态,const
成员是否提供了任何重要的优化机会?它是否有理由使用const User *
聚合并在更改时重建对象,而不是使用赋值运算符?
谢谢你的简短评论!
在SO和HERE 上查看它
首先,关于词汇表的一个注释:根据定义,实体对象具有身份,因此不支持分配。我想你的意思是值对象。
否则:我通常发现在制作数据方面没有什么优势成员常量。正如你所注意到的,这样做会使任务变得不可能,这意味着它们不能是值类型的常量。对于实体对象,这些对象无法分配,在制作中有一些价值不可变成员(例如标识符)常量,但由于所有访问都在您控制的一小段代码,其值要小得多与公共接口中的CCD_ 10相比。
另一种可能性是为这样的成员定义不可变的类型。它是将CCD_ 11定义为CCD_将其定义为std::string
和Identifier
,即使它包含只有一个类型为std::string
的数据成员会限制您(这也将有助于改变代表权稍后标识符的。)
- 私有类型的静态常量成员
- constexpr构造函数需要常量成员函数时出现问题
- Clang 格式 10.0 与 5.0 常量成员函数的格式不同
- 为什么"具有常量成员的结构"类型的指针不能指向"具有非常量成员的结构"?
- 常量成员函数中成员变量的类型
- 如何处理运算符=中的常量成员?
- 常量成员和没有setter的私有成员之间有什么区别
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 移动具有常量成员的类的构造和分配
- ARM C++编译器不会编译具有可变常量成员的结构
- 强制在编译时计算类的类的常量成员
- 类中常量成员函数的 c++ 链接错误
- 为什么常量成员可以初始化两次?
- 专用常量成员函数的成员检测
- 与其他静态const成员初始化静态常量成员
- 具有静态和常量成员变量的对象
- 结构中的常量成员即使在初始化后也返回 0
- 在非常量成员函数中,为什么点这个非常量,而 decltype 指针这是常量
- 有没有一种通用方法来"unprotect"静态常量成员?
- 如何初始化共享复杂初始化代码的多个常量成员变量?