就其存储而言,C ++类中的静态const和const变量之间是否有区别?

Tar*_*ing 1 c++ embedded

这是我的代码片段:

class modbus {
public:
  static const uint8_t modbusHeader = 2;
  static const uint8_t modbusCRC = 2;
  static const uint8_t modbusPDU = modbusHeader + modbusCRC;
  static const uint8_t exceptionBase = 0x80;
  static const uint32_t transmitTimeout = 5000;
};
Run Code Online (Sandbox Code Playgroud)

它为我需要在类中创建的modbus数据包定义了一些大小。我在嵌入式环境中工作,因此大小优化和注意事项始终存在。因此,我确实希望在闪存的只读部分中仅出现一次这些常数值。

我选择将这些变量设置为,static但这是否必要?编译器是否会推断这些值仅需要在二进制文件中保存一次,因此在删除static关键字时仅将它们包括一次?

Lig*_*ica 5

从技术上讲,我想如果编译器知道您从未在sizeof上执行过modbus,并且从未通过不同的modbus*指针获取这些成员的地址,并且知道它们仅使用完全相同的琐碎值进行了初始化,则可以使用“ as-if ”规则,将它们合并为一个,并从存储方面将其从类中删除。(如果不能仅保证其中之一,则会违反该语言的规则。)

但这是一个很高的要求(尤其是当您考虑多个翻译单元时),并且实际上没有用。

所以不行。我不希望这会发生。

您确实应该制作这些东西static const(也许撒上constexpr)。