c++ - c++ 类中的静态 const 和 const 变量在存储方面是否存在差异
问题描述
这是我拥有的代码片段:
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;
};
它为我需要在类中创建的 modbus 数据包定义了一些大小。我在嵌入式环境中工作,因此尺寸优化和考虑总是存在的。因此,我真的希望在闪存的只读部分中只出现一次这些常量值。
我选择将这些变量设置为,static
但这有必要吗?编译器是否会推断这些值只需要在二进制文件中保存一次,因此在我删除static
关键字时只包含一次?
解决方案
我想,从技术上讲,如果编译器知道你从来没有执行sizeof
过modbus
,并且从来没有通过不同的指针获取这些成员的地址modbus*
,并且知道它们只是用完全相同的平凡值初始化,它可能会使用“as-if " 规则将它们合并为一个并在存储方面将它们从类中删除。(如果它不能保证其中之一,就会违反语言规则。)
但这是一项艰巨的任务(特别是当您考虑多个翻译单元时),并且不会真正有用。
所以不行。我不希望这会发生。
你确实应该做那些东西static const
(也许洒一点constexpr
)。
推荐阅读
- java - 如何将类型(通用)传递给注释?
- if-statement - 我正在尝试使用重复和 if 条件将列中的单元格值减少 1
- python-3.x - 我想将来自多个文本框的值加起来并插入到最终的文本框中
- terminal - 在命令行提示符的上下文中,“nord”是什么意思?
- laravel - Laravel 6 保留两个服务器和子域之间的会话
- java - 使用 relativelayout 共享 TextView 内容
- c# - 在 C# 中有效地在海量文件中搜索字符串
- matlab - 从音频文件 Matlab 中去除噪声
- python - 如何计算姿势图优化器(slam)?
- c++ - 有没有办法合并两个(或多个)for循环以降低整体时间复杂度?