C 编译器通常会优化初始化的全局数据吗?

Do C compilers generally optimize out initialized global data?

提问人:PKFreeZZy 提问时间:10/3/2023 最后编辑:sepp2kPKFreeZZy 更新时间:10/3/2023 访问量:30

问:

我正在为 Nintendo 64 反编译 Super Smash Bros.。它于 1999 年发布,使用效率相当低的编译器 (IDO 7.1) 构建,缺少某些功能。我的目标是使代码尽可能灵活,开箱即用。

我必须克服的一个障碍是初始化一个数组,该数组需要包含具有不同位域的脚本的各种命令;这些是按顺序解析的,并且它们都需要存在。如果不是因为 IDO 不支持指定的初始值设定项,联合可以在这里工作;只能设置联盟的第一个成员。

我的下一个最佳选择是逐个初始化命令,但问题是只会引用脚本中的第一个命令。一般来说,编译器是否倾向于丢弃“未使用”的初始化数据?IDO 很可能不会,但我想知道是否有必要进行任何体操来保留未引用的数据。

如果所有其他方法都失败了,我必须将其设置为无符号整数数组,并以二进制格式将所有内容塞入其中,并使用宏进行位移。

// ColAnim Script 0 is NULL

// 0x8012CA90 - ColAnim Script 1 (only Col1_Ev0 referenced)
caColorEventSetRGBA     caColorEvents_Col1_Ev0 = { caColorEvent_Kind_SetColor1, 0xFF, 0xFF, 0xFF, 0x30 };
caColorEventDefault     caColorEvents_Col1_Ev1 = { caColorEvent_Kind_Wait, 65535 };
caColorEventGoto        caColorEvents_Col1_Ev2 = { caColorEvent_Kind_Goto, &caColorEvents_Col1_Ev0 };

// 0x8012CAA4 - ColAnim Script 2 (only Col2_Ev0 referenced)
caColorEventDefault     caColorEvents_Col2_Ev0 = { caColorEvent_Kind_ToggleColorOff };
caColorEventDefault     caColorEvents_Col2_Ev1 = { caColorEvent_Kind_End };

// 0x8012CAAC - ColAnim Script 3 (only Col3_Ev0 referenced)
caColorEventSetRGBA     caColorEvents_Col3_Ev0 = { caColorEvent_Kind_SetColor1, 0xFF, 0xFF, 0xFF, 0x82 };
caColorEventBlendRGBA   caColorEvents_Col3_Ev1 = { caColorEvent_Kind_BlendColor1, 3, 0xFF, 0xFF, 0xFF, 0x32 };
caColorEventDefault     caColorEvents_Col3_Ev2 = { caColorEvent_Kind_Wait, 3 };
caColorEventDefault     caColorEvents_Col3_Ev3 = { caColorEvent_Kind_ToggleColorOff };
caColorEventDefault     caColorEvents_Col3_Ev4 = { caColorEvent_Kind_Wait, 1 };
caColorEventGoto        caColorEvents_Col3_Ev5 = { caColorEvent_Kind_Goto, &caColorEvents_Col3_Ev0 };
变量 优化 初始化全局

评论

0赞 Armali 10/4/2023
您似乎想在脚本(如数组)中使用命令;在这种情况下,您不仅要担心非初始命令被丢弃,还要担心它们被非连续存储。

答: 暂无答案