C ++相当于指定的初始化器?
最近我一直在研究一些嵌入式设备,我们有一些结构和联合需要在编译时进行初始化,以便我们可以将某些东西保存在不需要修改的闪存或ROM中,并节省一些闪存或SRAM有点性能成本。目前代码编译为有效的C99,但是如果没有这种调整,它也可以编译为C ++代码,并且支持以这种方式编译的东西也会很棒。阻止这种情况的关键之一是我们使用的C99指定初始值设定项在C ++的C子集中不起作用。我不是一个C ++ buff,所以我想知道在C ++兼容的C或者C ++中仍然允许在编译时进行初始化以便结构和联合不需要的简单方法。在SRAM中启动程序后初始化。
还有一点需要注意:指定初始化程序使用的一个关键原因是初始化,而不是联盟的第一个成员。此外,坚持使用标准C ++或ANSI C是为了保持与其他编译器的兼容性(我知道GNU扩展提供类似指定的初始化器而没有C99)。
没有找到相关结果
已邀请:
6 个回复
锑寝粒
文件中,例如:
粟痢凰副
骂陋冠
这与C99风格的指定初始化器具有非常相似的外观,我将在后面提到一个警告。 (你可能会在#ifdef __cplusplus中包装它,如果你想要用任何一个编译结构。)我看到的第二个代码版本是这样的:
基本上,通过查看反汇编,看起来第一个例子实际上更慢。我看过装配输出,好吧,我必须有点生疏。也许有人可以给我一些见解。第一个cpp的汇编输出编译并看起来像:
第二个例子看起来像:
这两个都是用
命令生成的。显然,直观上效率较低的示例在指令数量方面产生了更高效的操作码。另一方面,在很少的情况下,我可以想象一些指令是关键的。 (另一方面,我真的很难理解不是人类写的集会,所以也许我错过了一些东西......)我认为这提供了一个解决方案,尽管已经很晚了,詹姆斯问的问题。我应该测试的下一件事是在C99中是否允许相同的初始化;如果有效,我认为它完全解决了詹姆斯的问题。 免责声明:我不知道这对于除g ++以外的任何其他编译器是否有效或行为相似。
钾涎净介
在C ++中,union也可以有构造函数。可能这是你想要的吗?
古擅坛犯
我尝试从S派生S1,其中S1的内联默认构造函数调用S(int)并传递硬编码值...
...然后用gcc 4.0.1 -O2 -S编译。希望是优化器会看到s1.mB必然是22,并在编译时分配它,但是来自汇编程序......
...看起来生成的代码在main之前在运行时进行初始化。即使它有效,它也很难像C99那样可编译,并且会为你想要初始化的每个对象获得一个类的kludge;所以,不要打扰。
委婪绷冗诉
这是结果:
C ++初始值设定项的唯一内容是您需要初始化结构的所有元素,否则其余元素将使用零进行初始化。你不能挑选。但对于您的用例,这应该仍然可以。 还有一点需要注意:指定初始化程序使用的一个关键原因是初始化,而不是联盟的第一个成员。 为此,您需要使用示例中显示的“替代方法”,其中我通过提供等效的int值来设置“float”成员。这有点像黑客,但如果它解决了你的问题。