混合单独编译的对象

2024-02-21

让我来上课吧class Drawable。它可以有许多成员、成员函数、父类,也可以非常简单。对于这个例子来说,这并不重要。另外,假设它是某种 GUI 元素。

然后,假设我有一个渲染引擎,它作为 GCC 库提供engine.a。该库包含class Screen,其中有方法void Screen::add(const Drawable & child)。我所拥有的只是标头和库本身。在我的应用程序中我实例化Screen,创建几个Drawable物体和add他们到Screen.

我的问题:
我的 GCC 工具链(或我的 GCC 工具链的版本)可以为以下内容创建不同的内存布局吗Drawable对象比编译中的对象engine.a?标准没有定义它,它是一个实现细节。无论哪种方式,它都会完美链接。我如何知道这一点以及如何确定行为是否正确?

P.S. 我主要使用 ARM GCC 工具链来实现 Cortex-M 架构。但我的问题不仅限于此.

P.P.S. 如果您有任何相关但与 GCC 无关的想法,请随时分享。

谢谢。

EDIT
这个问题仅与编译器内部有关。


我的 GCC 工具链(或我的 GCC 工具链版本)是否可以为 Drawable 对象创建与编译的 engine.a 不同的内存布局?

是的。考虑下面这个愚蠢的例子:

struct Drawable
{
   #ifdef ENABLE_COUNTERS
   int counter = 0;
   #endif

  // ...
};

也许有人编译了-DENABLE_COUNTERS而其他人则没有。这违反了单一定义规则。或者,可能编译了一个工具链,其中整数为 32 位,而另一个工具链则为 64 位。

链接器为了快,不会抱怨;它只会丢弃除一个定义之外的所有定义,这可能会造成各种破坏(尤其是虚拟函数调用,当偏移量出错时可能会变得很奇怪)。

我如何知道这一点以及如何确定行为是否正确?

gcc has flto-odr-type-merging https://gcc.gnu.org/onlinedocs/gcc-9.1.0/gcc/Optimize-Options.html and -Wodr这可以在您编译时为您提供帮助。

谷歌的ASAN https://github.com/google/sanitizers/wiki/AddressSanitizerOneDefinitionRuleViolation还可以检查内存布局以确保它们相同。


仅关于您对编译器内部的编辑。

请参考GCC关于ABI稳定性的指南:https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html

Roughly请讲。每个主要编译器版本都有一个新的 ABI。后来的次要版本与相同的主要版本几乎总是兼容的。

您可以控制目标 ABI-fabi-version

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

混合单独编译的对象 的相关文章

  • 以编程方式在网格视图列上显示数据

    我有一个产品数量列表和一个网格视图 网格视图已经绑定到一些数据 但我想在网格视图的第三列显示产品数量列表 以下是如何将数据绑定到网格视图的代码 gvProduct DataSource distSPUItem gvProduct DataB
  • 类变量在其定义范围内?

    这可能是一个愚蠢的问题 我正在尝试制作文本泥 我需要每个 Room 类包含其他 Room 类 以便在尝试移动到它们或从它们获取信息时可以引用 但是 我不能这样做 因为我显然无法在其定义中声明一个类 那么 我该怎么做呢 当我说我做不到时 我的
  • 如何在运行 ASP.NET 页面时以编程方式设置表格背景?

    我有一个 aspx 页面 其默认背景颜色是一种 当选择单选按钮的某个选项时 我需要能够以编程方式更改它 我尝试设置表的 ID 字段 但似乎无法在 C 代码隐藏文件中访问它 我原来的表是 table style width 100 backg
  • 实体框架 - sql server 表中未设置默认值

    SQL Server 2005 数据库表有一列 createdon 其默认值设置为 getdate 我正在尝试使用实体框架添加记录 createdon 列未更新 我是否错过了实体框架中的任何属性 请提出建议 这是实体框架存在的少数问题之一
  • 你好世界,裸机 Beagleboard

    我正在尝试在我的 Beagleboard xm rev 上运行 hello world 类型的程序 C 通过调用 Cputs功能来自装配 到目前为止 我一直使用这个作为参考 http wiki osdev org ARM Beagleboa
  • 递归显式模板实例化以导出库的符号

    在我之前的问题中我问过递归显式模板实例化是否可能 https stackoverflow com questions 7395113 is recursive explicit template instantiation possible
  • C# - 如何从 Steam 交易 API 获取图标的 URL(编码)

    以下是 API 为每个项目返回的 XML 部分
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • 可以轻易移动,但不可轻易复制

    是否可以创建类类型 即 普通移动构造 但不是普通复制构造 但仍然可复制构造 普通复制构造 但不是普通移动构造 但仍然可移动构造 可以简单地复制分配 但不能简单地移动分配 但仍然可以移动分配 可以简单地移动分配 但不能简单地复制分配 但仍然可
  • 驱蚊程序?

    不 我认真的 最近 我读到 当电脑的压电蜂鸣器以一定频率振动时 声音可以驱赶蚊子 真的吗 如何以编程方式访问 PC 蜂鸣器 而不是扬声器 最好使用 C 我不知道有没有蚊子 但我的头疼得要命 啊啊 using System Runtime I
  • 将私有部分保留在 C++ 标头之外:纯虚拟基类与 pimpl

    我最近从 Java 和 Ruby 切换回 C 令我惊讶的是 当我更改私有方法的方法签名时 我必须重新编译使用公共接口的文件 因为私有部分也位于 h 文件中 我很快想出了一个解决方案 我想这对于 Java 程序员来说是典型的 接口 纯虚拟基类
  • 在 C# 中给定周数和年份,计算一周的开始和结束日期(基于 ISO 规范)

    我需要生成一份报告 显示一年中的 52 周 或某些年份的 53 周 及其开始日期和结束日期 有一个 ISO 规范可以做到这一点 但看起来非常复杂 我希望有人知道在 C 或 Visual Basic 中执行此操作的方法 实际上适用于 Visu
  • 变形:Opencv 使用 Visual Studio 将图像显示到曲面屏幕

    我正在尝试使用 opencv API 来扭曲图像 以便将其显示到曲面屏幕上 我已经浏览了opencv中提供的翘曲apihere http docs opencv org 2 4 modules stitching doc warpers h
  • 给出对象的指针作为参数

    假设我有 void func foo obj 我有 foo object 我该如何制作object进入争论func 只需取消引用它即可 func object
  • 如何在 ASP.NET MVC 中获取参数数组作为 GET / POST?

    如何最好地获取数组 item gt value 对作为 GET POST 参数 在 PHP 中 我可以这样做 网址 这得到的参数为 Array a gt Array one gt 100 two gt 200 有什么方法可以在 ASP NE
  • 在 4.x 内核上的 64 位内存中查找系统调用表

    我正在尝试编写一个简单的内核模块来查找 Linux 中的 sys call table 但遇到了一些麻烦 我在这里找到了 32 位 Linux 的基本指南 https memset wordpress com 2011 03 18 sysc
  • 从资源文件获取 DisplayName [重复]

    这个问题在这里已经有答案了 我在 App GlobalResources 文件夹中有特定于文化的资源文件 现在我需要从此资源文件中读取 DisplayName 属性的值 我在用 Display Name MerchantName Resou
  • 以编程方式连接和断开 USB,“无需拔出和重新插入”

    我需要以编程方式连接和断开 USB 也就是说 我已经插入了USB设备 我需要使用 C NET 应用程序传输文件 该应用程序将监视特定文件夹并将文件从该文件夹传输到 USB 驱动器 我需要在文件传输后断开 USB 设备的连接 并在需要时连接
  • 为 winforms ComboBox 中的单个项目着色?

    我遇到了一个困境 我有一个表单 其中包含许多组合框 其中包含在某些情况下可能无效 过时的信息 选项 项目 我不能简单地从项目中删除过时的信息 但我确实想在选项无效时为用户提供视觉线索 我正在考虑对项目进行着色 可能是红色 来指示它们是否无效
  • 将 Web 场迁移到 ASP.NET 运行时版本 4,同时保持会话

    我们已将 Web 应用程序从 net 运行时 2 v 3 5 迁移到 net 运行时 4 v 4 5 我有一个部署问题 我们的 sessionstate 服务器是一个 stateserver 并在单独的服务器上运行框架 2 中的 aspne

随机推荐

  • 当我在列表中使用复选框时,未调用 ListItem onClick 方法

    大家好 我是 android 新手 我想显示复选框的动态列表 并且在单击多个复选框时我希望将它们的数据放在单个字符串中 但我的问题是我无法调用 onListItemClick 方法 如果我在列表中使用复选框 然而 根据我的理解和经验 在列表
  • LUIS 与特殊字符相关的问题

    TEXT 被转换为 TEXT 在 LUIS 中 当我们识别实体名称时 特殊字符的问题 请参考下图 这里是每月的智商仪表板hospitalists被转换为reportname gt monthly iq dashboard hospitali
  • 测试重定向 CakePHP 2.0

    我一直在看食谱上的一些例子 但我不明白 http book cakephp org 2 0 en development testing html a more complex example http book cakephp org 2
  • flutter-desktop-embedding 如何构建 exe 文件

    in 颤动桌面嵌入 https github com google flutter desktop embedding 我是windows环境 可以运行 但是不知道如何构建exe文件 我想知道该怎么办 If you flutter buil
  • 对 JSONP 请求的工作原理感到困惑

    我无法理解 jsonp 请求如何工作的细节 我已经阅读了包括 jsonp 上的 wiki 在内的多个资料来源 但对于在进行 jsonp 调用时回调实际上如何获取从服务器返回的函数仍然非常困惑 例如 在wiki中 请求的来源设置为 src h
  • 在不使用 GIT 的情况下将 WAR 文件部署到 Openshift?

    我想将 WAR 文件上传到我的开放式换档帐户 但这迫使我 使用 GIT 或 GITHUB here https www openshift com kb kb e1088 how to deploy pre compiled java ap
  • 从服务器获取数据时 Android 中的列表视图

    我正在尝试将数据异步填充到列表视图中 我正在从服务器检索数据作为 JSON 响应 MainActivity java public class MainActivity extends Activity url to make reques
  • Availability.h 类宏

    是否可以有一个自定义可用性宏 例如 OSX AVAILABLE STARTING 我需要它以同样的方式执行 我只需要更改它的名称以及参数的版本和数量 是的 当然了 Objective C 是 C 的严格超集 因此 C 宏非常适合您使用 并且
  • 如何预测 merMod 对象(lme4)的术语?

    对于简单的glm对象 我可以使用predict fit type terms 检索包含每个项的拟合值的矩阵 相当于什么lmer resp glmer适配型号 据我所知 predict merMod功能不支持type terms 相当于什么l
  • 如何为 Outlook 创建“Internet 日历订阅”?

    目前 用户添加了一个 新的互联网日历 但它是 ICS 文件的一次性下载 我希望用户单击一个按钮即可将其个人日历添加为 Outlook 订阅 我想要自动更新 互联网日历订阅 http office microsoft com en us ou
  • VBA-获取所有文件属性

    我想获取文件夹中所有文件的属性 我已经将其用于固定数量的属性 我唯一关心的是找到最后一个属性的索引 用于GetDetailsOf方法 以便我可以列出所有属性 下面的函数返回属性计数 但不正确 因为它基于最后一个非空属性名称 然而 有一些索引
  • TinyMCE 编辑器中的换行符在预览中显示额外的行,而不是在代码中

    我将 BBCode 插件与 TinyMCE 结合使用 发现预览和 HTML 代码之间的换行符显示不一样 我在编辑器窗口中有以下几行 This is line one This is line three 第二行是空的 当我在 HTML 中查
  • Flutter Web 调试正常,但构建 Web 显示空白页面

    flutter doctor result Flutter Channel dev 1 21 0 1 0 pre on Microsoft Windows Version 10 0 19041 388 locale en US Androi
  • APK Openssl 版本

    我很困惑 我最近创建了 Google Play 应用程序 但几个小时后 我在控制台中收到消息 指出我使用了错误的 OpenSSL 版本 解压缩 p YourApp apk 字符串 grep OpenSSL gives OpenSSL 1 0
  • 如何使用 cygwin 排序对第 n 列上的制表符分隔文件进行排序?

    我有一个巨大的制表符分隔文件 我想在其第二列上进行排序 我需要使用制表符作为 cygwin 排序中的字段分隔符 所以我需要这样的东西 sort t t k 2 2 in txt gt out txt 但命令提示符按字面意思计算 t 而不是作
  • Storm 和 Spring 4 集成

    我有一个 Storm 应用程序原型 它读取 STOMP 流并将输出存储在 HBase 上 它可以工作 但不是很灵活 我正在尝试以与我们其他应用程序更一致的方式设置它 但不太幸运地弄清楚当前与 Storm 的工作方式 我们使用 spring
  • 如何在 Forth 中比较两个字符串?

    我可以在if声明还是我应该创建一个辅助布尔变量 这是我到目前为止的代码 顺便一提 IOX 是从用户那里获取输入 var compile VARIABLE complile lock compile var realPass compile
  • 如何更改ggplot2中图例文本的大小?

    我使用下面的数据和代码得到了这个图 我希望能够更改图例文本的大小 A B M1 M3 我尝试使用 legend text element text size 0 5 但它没有改变 有什么建议如何减小 legend text 的大小吗 Cod
  • 解决“只能在类中初始化静态常量整型数据成员”编译错误

    以下创建全局对象会导致编译错误 include stdafx h include
  • 混合单独编译的对象

    让我来上课吧class Drawable 它可以有许多成员 成员函数 父类 也可以非常简单 对于这个例子来说 这并不重要 另外 假设它是某种 GUI 元素 然后 假设我有一个渲染引擎 它作为 GCC 库提供engine a 该库包含clas