如何强制gcc编译器/链接器从可执行的未使用的静态数组中删除[重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

我有一个大数组uint8_t [95][5]包含7x5位图各种字符(每个字节1位未使用)。我只使用这95个字符中的一些,但是完整的静态数组无论如何都存储在程序存储器中。

我正在使用AVR,它具有有限的程序存储器,因此每个字节都很重要!所以我尝试将数组重写为一些模板专用类(见下文),但它没有解决问题。当我导入包含所有定义的头文件时,所有字符都成为我的可执行文件的一部分,无论它们是否在程序中使用。

例如,以下代码

#include <stdint.h>
template <char C> struct BitMap { static uint8_t cols[5]; };
template <> uint8_t BitMap<'3'>::cols[] = {0xFF,0xFC,0xAB};
int main() { return 0; }

g++ -Os编译生成

main:
    xor     eax, eax
    ret
BitMap<(char)51>::cols:
    .byte   -1
    .byte   -4
    .byte   -85
    .zero   2

由于这个静态数组没有在程序中使用,有没有办法指示编译器/链接器摆脱它?或者,有没有我可以做的代码技巧,只有在我使用它时才能实例化数组?

c++ arrays static g++ template-specialization
2个回答
1
投票

一种方法可能是声明模板函数的特化,每个模板函数返回数据,并且不会编译未使用的内联函数;但这可能意味着数组是即时创建的。你可以将你的字符字体定义打包成int64,并使其成为纯代码吗?


1
投票

您基本上描述了静态库链接的工作原理。

将对象作为单个模块放入静态库中。链接静态库。只有在代码中的某处引用了数组的符号时,模块才会被拉入可执行文件并成为可执行文件的一部分。

各种C ++链接器有时在解析静态库中定义的外部符号的数据引用时遇到问题。可能需要对链接器进行一些修补。

© www.soinside.com 2019 - 2024. All rights reserved.