pw_function: Size optimizations

Three size optimizations, ordered from most to least impactful:

- Remove the template parameters for NullFunctionTarget.

  The NullFunctionTarget is the same for all instantiations of
  pw::Function. Since it was a template, though, every unique
  pw::Function instantiation created new copies of the
  NullFunctionTarget virtual functions.

  This change drops the NullFunctionTarget template parameters. It uses
  a single FunctionTarget<void> implementation for all pw::Function
  instantiations. This does mean that the operator() function is called
  with extra arguments -- but it's illegal to call a null function
  anyway. MoveInitializeTo() and IsNull() functions are moved to a
  common base class shared by all pw::Function instantiations.

- Provide default implementation of the IsNull() virtual function. It is
  false for all derived classes except NullFunctionTarget, so the
  implementation can be shared across pw::Function instantiations.

- Forward arguments to operator(). In theory this can avoid unnecessary
  copies of the arguments, though the compiler should be able to
  optimize this. This has a very small size savings on optimized builds.

Change-Id: I4cc8caccc52d899d1a0f46cdf9f367e552f3e6e0
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/70160
Reviewed-by: Ewout van Bekkum <ewout@google.com>
Reviewed-by: Alexei Frolov <frolv@google.com>
Commit-Queue: Wyatt Hepler <hepler@google.com>
2 files changed
tree: 78754f4b74f6ae84ff657573744ce565aebe6452
  1. build_overrides/
  2. docker/
  3. docs/
  4. pw_allocator/
  5. pw_analog/
  6. pw_android_toolchain/
  7. pw_arduino_build/
  8. pw_assert/
  9. pw_assert_basic/
  10. pw_assert_log/
  11. pw_base64/
  12. pw_bloat/
  13. pw_blob_store/
  14. pw_bluetooth_hci/
  15. pw_boot/
  16. pw_boot_cortex_m/
  17. pw_build/
  18. pw_build_info/
  19. pw_build_mcuxpresso/
  20. pw_bytes/
  21. pw_checksum/
  22. pw_chrono/
  23. pw_chrono_embos/
  24. pw_chrono_freertos/
  25. pw_chrono_stl/
  26. pw_chrono_threadx/
  27. pw_cli/
  28. pw_console/
  29. pw_containers/
  30. pw_cpu_exception/
  31. pw_cpu_exception_cortex_m/
  32. pw_crypto/
  33. pw_docgen/
  34. pw_doctor/
  35. pw_env_setup/
  36. pw_file/
  37. pw_function/
  38. pw_fuzzer/
  39. pw_hdlc/
  40. pw_hex_dump/
  41. pw_i2c/
  42. pw_interrupt/
  43. pw_interrupt_cortex_m/
  44. pw_kvs/
  45. pw_libc/
  46. pw_log/
  47. pw_log_basic/
  48. pw_log_null/
  49. pw_log_rpc/
  50. pw_log_tokenized/
  51. pw_malloc/
  52. pw_malloc_freelist/
  53. pw_metric/
  54. pw_minimal_cpp_stdlib/
  55. pw_module/
  56. pw_multisink/
  57. pw_package/
  58. pw_persistent_ram/
  59. pw_polyfill/
  60. pw_preprocessor/
  61. pw_presubmit/
  62. pw_protobuf/
  63. pw_protobuf_compiler/
  64. pw_random/
  65. pw_result/
  66. pw_ring_buffer/
  67. pw_router/
  68. pw_rpc/
  69. pw_snapshot/
  70. pw_software_update/
  71. pw_span/
  72. pw_status/
  73. pw_stm32cube_build/
  74. pw_stream/
  75. pw_string/
  76. pw_symbolizer/
  77. pw_sync/
  78. pw_sync_baremetal/
  79. pw_sync_embos/
  80. pw_sync_freertos/
  81. pw_sync_stl/
  82. pw_sync_threadx/
  83. pw_sys_io/
  84. pw_sys_io_arduino/
  85. pw_sys_io_baremetal_lm3s6965evb/
  86. pw_sys_io_baremetal_stm32f429/
  87. pw_sys_io_mcuxpresso/
  88. pw_sys_io_stdio/
  89. pw_target_runner/
  90. pw_thread/
  91. pw_thread_embos/
  92. pw_thread_freertos/
  93. pw_thread_stl/
  94. pw_thread_threadx/
  95. pw_tls_client/
  96. pw_tls_client_boringssl/
  97. pw_tls_client_mbedtls/
  98. pw_tokenizer/
  99. pw_tool/
  100. pw_toolchain/
  101. pw_trace/
  102. pw_trace_tokenized/
  103. pw_transfer/
  104. pw_unit_test/
  105. pw_varint/
  106. pw_watch/
  107. pw_web_ui/
  108. pw_work_queue/
  109. targets/
  110. third_party/
  111. .bazelignore
  112. .bazelrc
  113. .clang-format
  114. .clang-tidy
  115. .eslintrc.json
  116. .gitattributes
  117. .gitignore
  118. .gn
  119. .prettierrc.js
  120. .pylintrc
  121. activate.bat
  122. AUTHORS
  123. bootstrap.bat
  124. bootstrap.sh
  125. BUILD.bazel
  126. BUILD.gn
  127. BUILDCONFIG.gn
  128. CMakeLists.txt
  129. LICENSE
  130. modules.gni
  131. OWNERS
  132. package.json
  133. PW_PLUGINS
  134. README.md
  135. tsconfig.json
  136. WORKSPACE
  137. yarn.lock
README.md

Pigweed

Pigweed is an open source collection of embedded-targeted libraries–or as we like to call them, modules. These modules are building blocks and infrastructure that enable faster and more reliable development on small-footprint MMU-less 32-bit microcontrollers like the STMicroelectronics STM32L452 or the Nordic nRF52832.

For more information please see our website: https://pigweed.dev/

Links