首页 > 解决方案 > 添加#if定义的预处理器指令将影响类成员的对齐

问题描述

我有一堂课,里面有很多成员

 int latest_encode_usage_ = 67;
  int perf_target_framerate_ = 0;
  std::map<uint8_t, uint16_t> pre_dlbitrate_;
#if defined(WEBRTC_TRANSCODE_CASE)
    bool is_screen_share_;
#endif

我在 build.gn 中定义WEBRTC_TRANSCODE_CASE

定义 += ["WEBRTC_TRANSCODE_CASE"]

所以is_screen_share_在类中是可见的,我用 RelWithDebInfo 编译了这段代码并得到了一个名为 liba.so 的共享库,然后我删除了预处理器指令

  bool is_perf_adaption_avalaible_;

  int latest_encode_usage_ = 67;
  int perf_target_framerate_ = 0;
  std::map<uint8_t, uint16_t> pre_dlbitrate_;
  bool is_screen_share_

并使用 RelWithDebInfo 编译代码得到 libb.so,当我执行命令diff <(objdump -d liba.so) <(objdump -d libb.so)并得到

1714248c1714248
<   7225b9: bf b8 0f 00 00          mov    $0xfb8,%edi
---
>   7225b9: bf c0 0f 00 00          mov    $0xfc0,%edi

,似乎有 8 个字节不同,但为什么呢?我只是不明白。它是 liba.so 的 objdump 的一部分:

0000000000722580 <_ZN6webrtc24CreateVideoStreamEncoderEjPNS_26VideoStreamEncoderObserverERKNS_26VideoStreamEncoderSettingsENS_18VideoEncoderConfig11ContentTypeE>:
  722580: 55                    push   %rbp
  722581: 48 89 e5              mov    %rsp,%rbp
  722584: 41 57                 push   %r15
  722586: 41 56                 push   %r14
  722588: 41 55                 push   %r13
  72258a: 41 54                 push   %r12
  72258c: 49 89 d5              mov    %rdx,%r13
  72258f: 53                    push   %rbx
  722590: 48 89 fb              mov    %rdi,%rbx
  722593: bf 90 00 00 00        mov    $0x90,%edi
  722598: 49 89 cf              mov    %rcx,%r15
  72259b: 41 89 f6              mov    %esi,%r14d
  72259e: 48 83 ec 28           sub    $0x28,%rsp
  7225a2: 44 89 45 bc           mov    %r8d,-0x44(%rbp)
  7225a6: e8 e5 0a 61 00        callq  d33090 <_Znwm> 
  7225ab: 4c 89 ee              mov    %r13,%rsi
  7225ae: 48 89 c7              mov    %rax,%rdi
  7225b1: 49 89 c4              mov    %rax,%r12
  7225b4: e8 17 0a 00 00        callq  722fd0 <_ZN6webrtc20OveruseFrameDetectorC1EPNS_25CpuOveruseMetricsObserverE>
  7225b9: bf b8 0f 00 00        mov    $0xfb8,%edi                                                                                                                                
  7225be: 4c 89 65 c8           mov    %r12,-0x38(%rbp)
  7225c2: e8 c9 0a 61 00        callq  d33090 <_Znwm> 
  7225c7: 44 8b 45 bc           mov    -0x44(%rbp),%r8d
  7225cb: 48 89 c7              mov    %rax,%rdi
  7225ce: 4c 89 f9              mov    %r15,%rcx
  7225d1: 4c 89 ea              mov    %r13,%rdx
  7225d4: 44 89 f6              mov    %r14d,%esi
  7225d7: 49 89 c4              mov    %rax,%r12
  7225da: 45 89 c1              mov    %r8d,%r9d
  7225dd: 4c 8d 45 c8           lea    -0x38(%rbp),%r8
  7225e1: e8 3a 3f 00 00        callq  726520 <_ZN6webrtc18VideoStreamEncoderC1EjPNS_26VideoStreamEncoderObserverERKNS_26VideoStreamEncoderSettingsESt10unique_ptrINS_20OveruseFra
  7225e6: 48 8b 7d c8           mov    -0x38(%rbp),%rdi
  7225ea: 48 85 ff              test   %rdi,%rdi
  7225ed: 74 06                 je     7225f5 <_ZN6webrtc24CreateVideoStreamEncoderEjPNS_26VideoStreamEncoderObserverERKNS_26VideoStreamEncoderSettingsENS_18VideoEncoderConfig11C

它是 libb.so 的 objdump 的一部分:

0000000000722580 <_ZN6webrtc24CreateVideoStreamEncoderEjPNS_26VideoStreamEncoderObserverERKNS_26VideoStreamEncoderSettingsENS_18VideoEncoderConfig11ContentTypeE>:
  722580: 55                    push   %rbp
  722581: 48 89 e5              mov    %rsp,%rbp
  722584: 41 57                 push   %r15
  722586: 41 56                 push   %r14
  722588: 41 55                 push   %r13
  72258a: 41 54                 push   %r12
  72258c: 49 89 d5              mov    %rdx,%r13
  72258f: 53                    push   %rbx
  722590: 48 89 fb              mov    %rdi,%rbx
  722593: bf 90 00 00 00        mov    $0x90,%edi
  722598: 49 89 cf              mov    %rcx,%r15
  72259b: 41 89 f6              mov    %esi,%r14d
  72259e: 48 83 ec 28           sub    $0x28,%rsp
  7225a2: 44 89 45 bc           mov    %r8d,-0x44(%rbp)
  7225a6: e8 e5 0a 61 00        callq  d33090 <_Znwm> 
  7225ab: 4c 89 ee              mov    %r13,%rsi
  7225ae: 48 89 c7              mov    %rax,%rdi
  7225b1: 49 89 c4              mov    %rax,%r12
  7225b4: e8 17 0a 00 00        callq  722fd0 <_ZN6webrtc20OveruseFrameDetectorC1EPNS_25CpuOveruseMetricsObserverE>
  7225b9: bf c0 0f 00 00        mov    $0xfc0,%edi                                                                                                                                
  7225be: 4c 89 65 c8           mov    %r12,-0x38(%rbp)
  7225c2: e8 c9 0a 61 00        callq  d33090 <_Znwm> 
  7225c7: 44 8b 45 bc           mov    -0x44(%rbp),%r8d
  7225cb: 48 89 c7              mov    %rax,%rdi
  7225ce: 4c 89 f9              mov    %r15,%rcx
  7225d1: 4c 89 ea              mov    %r13,%rdx
  7225d4: 44 89 f6              mov    %r14d,%esi
  7225d7: 49 89 c4              mov    %rax,%r12
  7225da: 45 89 c1              mov    %r8d,%r9d
  7225dd: 4c 8d 45 c8           lea    -0x38(%rbp),%r8
  7225e1: e8 3a 3f 00 00        callq  726520 <_ZN6webrtc18VideoStreamEncoderC1EjPNS_26VideoStreamEncoderObserverERKNS_26VideoStreamEncoderSettingsESt10unique_ptrINS_20OveruseFra
  7225e6: 48 8b 7d c8           mov    -0x38(%rbp),%rdi
  7225ea: 48 85 ff              test   %rdi,%rdi
  7225ed: 74 06                 je     7225f5 <_ZN6webrtc24CreateVideoStreamEncoderEjPNS_26VideoStreamEncoderObserverERKNS_26VideoStreamEncoderSettingsENS_18VideoEncoderConfig11C.

任何帮助将不胜感激!

标签: c++compilationpreprocessorpreprocessor-directive

解决方案


推荐阅读