java 抽象方法 虚方法的区别_声明抽象类(纯虚方法)会大幅增加二进制大小

以下是故事:我正在使用AC6 Toolpack为Linux中的ARM Cortex-M0处理器开发C软件 . 在我使用Keil(在windows中)(拥有自己的工具链)之前,我已经迁移到GNU-toolchain((GNU Tools for ARM Embedded Processors)5.2.1) . 我意识到的第一件事是;二进制文件大小大幅增加 . I have tested every compiler optimizations (except link time optimization, it gives an error in inline assembly, not part of question but may be related to answer). 然后开始用任何可用的工具检查可执行文件(elf文件不是bin,gnu生成两者):objdump,readelf,nm . 我发现了一些导致尺寸增加的符号,重要的是:' d_print_comp_inner ' , ' d_exprlist ', ' d_template_args ' . 但不知道是什么导致这些函数出现在二进制文件中 . (我使用过最小的库:nano newlib) . 长话短说我开始逐一消除代码以找到罪魁祸首 . 最后是抽象方法声明!

将功能定义为

virtual Return_type function_name(...)=0;

代替

virtual Return_type function_name(...);

添加45 KB和我提到的符号 . And this is the only change in source code. Empty definition in base class is present. Note that: method is still virtual and overridden in child classes

没有抽象类的大小输出:

text data bss dec hex filename

15316 24 4764 20104 4e88 temc_discovery.elf

抽象类的大小输出:

text data bss dec hex filename

61484 128 4796 66408 10368 temc_discovery.elf

这里的方法是抽象的符号和他们的大小,消除了两个版本中出现的符号和他们的大小 . (使用 nm 工具 . 不完整列表,大小> = 0x60的列表)

00002de4 t d_print_comp_inner

00001a34 t d_exprlist

00000ca4 t d_template_args

00000678 t d_type

00000574 t d_print_mod

000003f8 t d_encoding

000003e0 r cplus_demangle_operators

000003c8 t d_expression_1

000003a8 t d_name

00000354 t d_demangle_callback.constprop.15

000002e0 t d_print_mod_list

00000294 r cplus_demangle_builtin_types

00000268 t d_unqualified_name

00000244 T _printf_i

00000238 t d_print_function_type.isra.11

000001fc T _svfprintf_r

000001fc T _svfiprintf_r

000001f4 t d_print_array_type.isra.10

000001ce t d_print_cast.isra.12

0000018c t d_substitution

00000110 t d_operator_name

0000010c T __sflush_r

000000e8 T __swsetup_r

000000e6 t d_cv_qualifiers

000000e0 t d_print_subexpr

000000e0 t d_expr_primary

000000dc T _printf_common

000000cc T __cxa_demangle

000000c8 t d_source_name

000000c4 r standard_subs

000000c4 T __ssputs_r

000000b0 T __swbuf_r

000000ac T _malloc_r

000000a8 T _fputs_r

000000a4 T __smakebuf_r

000000a0 T __gnu_cxx::__verbose_terminate_handler()

00000096 t d_print_expr_op

0000008c T _free_r

0000008c t d_parmlist

0000008a t d_growable_string_callback_adapter

0000007c T __sfp

00000072 t d_append_buffer

00000068 T __sinit

00000060 d impure_data

我所熟悉的一些名称(例如printf,flush,malloc,fputs等)在源代码中甚至没有提到 .

任何人都知道造成这种行为的原因是什么?

Update: 我已经使用标志 --noexception 禁用异常,所以我没有给出任何异常 . 事实证明,这与答案有关,这里提到这一点很好 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值