Я разрабатываю встраиваемое приложение с использованием GCC / G ++, скомпилированного для arm-eabi. Из-за нехватки ресурсов я пытаюсь отключить стандартную обработку исключений C ++. Я компилирую код с "-fno-excptions
-nostartfiles -ffreestanding ".
Когда существует глобальный экземпляр класса, и этот класс содержит экземпляр другого класса в качестве члена, тогда связывается много кода обработки исключений. Это не было бы так плохо, за исключением того, что оно также приносит во многих вещах stdio, таких как printf, fopen, fclose и другие функции FILE. Это приложение не имеет файловой системы, и даже если это так, эти функции тратят слишком много места на коде.
Я понимаю, что даже при использовании -fno-exceptiontions G ++ связывается в операторе new, который использует исключения, поскольку в библиотеке нет оператора new, не использующего исключения (кроме new (nothrow)). Я создал замены для операторов new и delete, и они связаны с выводом, а также с нежелательными функциями стандартной библиотеки.
Что меня удивляет, так это то, что я нигде не звоню. Весь этот код связан только тогда, когда глобальный объект содержит другой объект.
Например:
class UartA {
...
private:
Ringbuffer* rxbuf;
};
class UartB {
...
private:
Ringbuffer rxbuf;
};
Если создан глобальный экземпляр UartA, обработка исключений, операторы new и материал stdio не связаны между собой. Это то, что я хочу.
Если создается глобальный экземпляр UartB (где rxbuf - это экземпляр, а не указатель), нежелательный код связывается.
Ни UartA, ни UartB не используют оператор new, исключения или stdio. Они отличаются только типом rxbuf. * 1016 *
Можете ли вы подсказать, как предотвратить добавление дополнительного кода? Кроме того, почему это связано для UartB, но не для UartA?