我正在使用GCC/G++编译器为arm-eabi开发嵌入式应用程序。由于资源限制,我试图禁用标准C++异常处理。我使用“-fno-exceptions -nostartfiles -ffreestanding”编译代码。
当一个类的全局实例存在,并且该类包含另一个类作为成员时,会链接大量的异常处理代码。这本身并不是太糟糕,但它还会带来许多stdio相关的内容,如printf、fopen、fclose和其他FILE函数。这个应用程序没有文件系统,即使有,这些函数也会浪费太多的代码空间。
我知道即使使用-fno-exceptions,G++仍然链接了一个使用异常的operator new,因为库没有非异常使用的operator new(除了new(nothrow))。我创建了operator new和delete的替代方法,并将其与不需要的标准库函数一起链接到输出中。
令我困惑的是,我没有在任何地方调用new。只有当全局对象包含另一个对象时,才会链接所有这些代码。
例如:
如果创建了UartA的全局实例,则不会链接异常处理、operator new和stdio代码。这正是我想要的。
如果创建了UartB的全局实例(其中rxbuf是实例而不是指针),那么不需要的代码将被链接进来。
UartA和UartB都不使用operator new、exceptions或stdio。它们仅在rxbuf的类型上有所不同。
您能否建议如何防止链接额外的代码?同时,为什么对UartB进行了链接,但没有对UartA进行链接?
当一个类的全局实例存在,并且该类包含另一个类作为成员时,会链接大量的异常处理代码。这本身并不是太糟糕,但它还会带来许多stdio相关的内容,如printf、fopen、fclose和其他FILE函数。这个应用程序没有文件系统,即使有,这些函数也会浪费太多的代码空间。
我知道即使使用-fno-exceptions,G++仍然链接了一个使用异常的operator new,因为库没有非异常使用的operator new(除了new(nothrow))。我创建了operator new和delete的替代方法,并将其与不需要的标准库函数一起链接到输出中。
令我困惑的是,我没有在任何地方调用new。只有当全局对象包含另一个对象时,才会链接所有这些代码。
例如:
class UartA {
...
private:
Ringbuffer* rxbuf;
};
class UartB {
...
private:
Ringbuffer rxbuf;
};
如果创建了UartA的全局实例,则不会链接异常处理、operator new和stdio代码。这正是我想要的。
如果创建了UartB的全局实例(其中rxbuf是实例而不是指针),那么不需要的代码将被链接进来。
UartA和UartB都不使用operator new、exceptions或stdio。它们仅在rxbuf的类型上有所不同。
您能否建议如何防止链接额外的代码?同时,为什么对UartB进行了链接,但没有对UartA进行链接?