添加虚拟析构函数会增大代码大小 我在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