【发布时间】:2016-12-12 12:00:20
【问题描述】:
假设T 和const T 是两个大小相同且对齐方式相同的类型似乎是合理的,但在考虑了一些实际系统之后,它们似乎可能会有所不同。
让我解释一下:
假设您的系统具有两种类型的内存:RAM 和闪存(只读)。 RAM 是 8 位可寻址的,而 Flash 只能是 16 位可寻址的。假设这是T:
struct T
{
uint8_t x;
uint16_t y;
};
在字节可寻址 RAM 中,此结构体的长度为 3 个字节......但在双字节可寻址闪存(const 变量所在的位置)中,此结构体必须至少为 4 个字节长,因为对齐问题。
所以这是我的问题:
c 和 c++ 标准是否保证const 和非const 类型的大小和对齐方式?
【问题讨论】:
-
你做了很多没有人能保证的假设。无论如何,大多数 RAM 与闪存的东西都来自您的链接器脚本。
-
@JonathonReinhart 因此问题
-
这个问题很棘手。答案是“是的,它们必须是相同的大小”,但是,flash not“
const variable would reside。可能是你在那里放了很多 const 值,但 const 没有意思是flash。特别是我可以有一个函数调用的const int参数,它将在堆栈上,而不是在flash中。最后,我相信这样的系统违反了同质的C内存模型,所以它的行为将是编译器扩展。 -
请注意,像您描述的那种花哨的硬件通常带有自定义的、不符合标准的编译器,这些编译器能够以不符合标准为代价来利用全部硬件潜力标准中的一些细节......所以如果你真的需要使用 Flash v RAM 的东西,你仍然可以使用不符合标准的编译器。
-
@CortAmmon 我不同意你的说法“我相信这样的系统违反了同质的 C 内存模型”。是的,C 有一个同质的抽象内存模型,但 C 标准不要求实现具有同质内存,只要求它act 像它一样。编译器可以绕过这个问题(以优化为代价)并表现得像它具有同质内存的一种方法是使所有
Ts 长 4 个字节,并且指向T的指针中有一个特殊位指示它是位于闪存还是 RAM .....