添加#if 定义的预处理器指令将影响类成员的对齐

如何解决添加#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,%r12
  7225b4: e8 17 0a 00 00        callq  722fd0 <_ZN6webrtc20OveruseFrameDetectorC1EPNS_25cpuOveruseMetricsObserverE>
  7225b9: bf c0 0f 00 00        mov    $0xfc0,%rdi
  7225ed: 74 06                 je     7225f5 <_ZN6webrtc24CreateVideoStreamEncoderEjPNS_26VideoStreamEncoderObserverERKNS_26VideoStreamEncoderSettingsENS_18VideoEncoderConfig11C.

任何帮助将不胜感激!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?