添加虚拟析构函数会增大代码大小 我在C++的ARM皮层M3上用最新的ARM EABI GCC 6.3来欺骗。 我创建了一个虚拟类并创建了该类的全局对象: B类 {}; A类:B类 { 公众: () { RCC->APB2ENR |=RCC_APB2ENR_IOPCEN; GPIOC->CRH=1; GPIOC->ODR |=1

添加虚拟析构函数会增大代码大小 我在C++的ARM皮层M3上用最新的ARM EABI GCC 6.3来欺骗。 我创建了一个虚拟类并创建了该类的全局对象: B类 {}; A类:B类 { 公众: () { RCC->APB2ENR |=RCC_APB2ENR_IOPCEN; GPIOC->CRH=1; GPIOC->ODR |=1,c++,gcc,arm,C++,Gcc,Arm,如果不进行整个程序优化,则不清楚析构函数是否实际不可访问。可能存在另一个带有构造函数的转换单元,该构造函数生成一个线程,该线程随后调用exit函数。没有副作用的无限循环是未定义的行为,如果我重新调用l正确。有一个例子通过无限循环结束来“推翻”Fermat的最后一个定理。为什么要在这种情况下添加虚拟析构函数?只有在删除指向基类的指针时才需要虚拟析构函数。您可以共享-s(而不是-c)的编译结果吗,使用和不使用虚拟析构函数?这样我们就可以准确地检查编译的内容。您似乎没有启用任何优化。@JamesRoo

如果不进行整个程序优化,则不清楚析构函数是否实际不可访问。可能存在另一个带有构造函数的转换单元,该构造函数生成一个线程,该线程随后调用
exit
函数。

没有副作用的无限循环是未定义的行为,如果我重新调用l正确。有一个例子通过无限循环结束来“推翻”Fermat的最后一个定理。为什么要在这种情况下添加虚拟析构函数?只有在删除指向基类的指针时才需要虚拟析构函数。您可以共享
-s
(而不是
-c
)的编译结果吗,使用和不使用虚拟析构函数?这样我们就可以准确地检查编译的内容。您似乎没有启用任何优化。@JamesRoot这很有趣。没有副作用的无限循环听起来像是有史以来定义最严格的行为:)很公平。尽管我尝试了-flto,代码变得更大了。无论如何,有没有办法获得r不必要的拆下代码的id?您需要任何全局构造函数或析构函数吗?您可能可以使用链接器脚本删除
init
/
fini
部分。好吧,我不需要全局析构函数-这就是我的问题。但我需要全局构造函数,我经常使用静态对象。我不太擅长gcc链接器语法,can是否可以使用一些编译/链接选项来完成?
 8000260:   d3f9        bcc.n   8000256 <FillZerobss>
 8000262:   f000 f89f   bl  80003a4 <SystemInit>
 8000266:   f000 f957   bl  8000518 <__libc_init_array>
 800026a:   f000 f865   bl  8000338 <main>
 800026e:   4770        bx  lr