有哪些重构方法可以减少编译代码的大小?

2024-01-01

我有一个需要新功能的旧固件应用程序。应用程序的大小已经接近设备的有限闪存容量,而少数新功能和变量将其推向极限。打开编译器优化确实可以解决问题,但客户对此持谨慎态度,因为它们过去曾导致过失败。那么,在重构 C 代码以产生更小的输出时,需要注意哪些常见问题呢?


  • 尽可能使用生成函数而不是数据表
  • 禁用内联函数
  • 将常用的宏转化为函数
  • 降低大于本机机器大小的变量的分辨率(即 8 位微型,尝试摆脱 16 和 32 位变量 - 将某些代码序列加倍和四倍)
  • 如果微控制器具有较小的指令集(Arm拇指),请在编译器中启用它
  • If the memory is segmented (ie, paged or nonlinear) then
    • 重新排列代码,以便需要使用更少的全局调用(更大的调用指令)
    • 重新排列代码和变量使用以消除全局内存调用
    • 重新评估全局内存使用情况 - 如果可以将其放在堆栈上那就更好了
  • 确保您在关闭调试的情况下进行编译 - 在某些处理器上,这会产生很大的差异
  • 压缩无法即时生成的数据 - 然后在启动时解压到 RAM 中以便快速访问
  • 深入研究编译器选项 - 可能每个调用都是自动全局的,但您可以安全地逐个文件地禁用它以减少大小(有时显着)

如果您仍然需要更多空间compile with optimizations打开,然后查看生成的程序集与未优化的代码。然后重新编写发生最大变化的代码,以便编译器在关闭优化的情况下基于棘手的 C 重写生成相同的优化。

例如,您可能有几个进行类似比较的“if”语句:

if(A && B && (C || D)){}
if(A && !B && (C || D)){}
if(!A && B && (C || D)){}

然后创建一个新变量并提前进行一些比较将使编译器免于重复代码:

E = (C || D);

if(A && B && E){}
if(A && !B && E){}
if(!A && B && E){}

如果您打开编译器,这是编译器自动为您执行的优化之一。还有很多很多其他内容,如果您想学习如何在 C 代码中手动执行此操作,您可能会考虑阅读一些编译器理论。

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

有哪些重构方法可以减少编译代码的大小? 的相关文章

  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐

  • 我可以告诉我的应用程序从特定位置加载所有程序集 (DLL) 吗?

    我的应用程序使用第三方 SDK 该 SDK 安装在每台拥有我的应用程序的计算机上 我不想在我的应用程序部署中添加这些 SDK DLL 因为它会占用大量空间 由于其他原因 无法在 GAC 中注册 DLL 无论如何 有没有办法告诉我的应用程序所
  • 即使没有 gc 根,WebappClassLoader 也会发生内存泄漏

    这是头部转储 更新于 10 29 2013 https dl dropboxusercontent com u 9210700 java pid9478 hprof 我正在一个网络应用程序中工作 雄猫7 0 24 Java 6 Spring
  • 当我期望看到失败时,为什么我看到 attoparsec 的部分结果?

    我对 attoparsec 的这种行为有点困惑 ghci gt m Data Attoparsec Text gt m Data Text gt parse string pack module pack mox Partial gt pa
  • iOS 共享扩展程序无法在 Chrome 中运行

    适用于 Safari 不适用于 Chrome 也许这个问题很简单而且愚蠢 但我是新手iOS开发我找不到任何正确的解决方案来解决这个问题 我需要得到 1 页面网址2 页面名称 扩大 信息表
  • SwiftUI:上下文菜单后出现阴影故障

    我有一个带有阴影和上下文菜单的矩形 当我关闭此上下文菜单时 矩形的阴影会出现延迟 约 0 5 秒 完整矩形的阴影以及内部元素的阴影 我不确定我做错了什么 struct Playground View var body some View V
  • 如何围绕某个点旋转顶点?

    想象一下 二维空间中有两个点 您需要将其中一个点以另一个点为中心旋转 X 度 float distX Math abs centerX point2X float distY Math abs centerY point2Y float d
  • 如果 WooCommerce 结帐中存在特定产品类别,请删除其他产品

    我正在为客户创建一个登陆页面 并使用具有以下类别的特定产品landing page 我希望当前在购物车页面上的其他产品在类别时被删除landing page存在于购物车中 这是片段 现在 它删除了其中的所有产品 因为 woocommerce
  • 按组向原始数据添加一列平均值[重复]

    这个问题在这里已经有答案了 我想添加一列基于因子列的均值列R data frame 像这样 df1 lt data frame X rep x LETTERS 1 2 each 3 Y 1 6 df2 lt aggregate data d
  • 如何根据命令更改视图+视图模型

    我刚刚开始了解整个 WPF 事物 需要了解一些基本元素 到目前为止 我已经了解了 MVVM 模式中的模型 视图和 ViewModel 我不明白的是在哪里 如何根据此更改我的用户界面 假设我有一个需要先登录的应用程序 我的登录是一个视图和一个
  • 注释 Mptt 模型的下降总数

    Question 给定下面的模型 我想获取所有页面的查询集 并用与页面关联的线程中的评论总数进行注释 包括与页面关联的评论线程树中的所有评论 我在用Django mptt https django mptt readthedocs io e
  • “对私有方法的致命错误调用”但方法受到保护

    第一次在 PHP 中扩展一个类 我收到一个致命错误 提示该方法是私有的 而实际上它不是 我确信这是基本的东西 但我研究过书籍和论坛 但我无法确定我做了什么来产生这个错误 非常感谢任何帮助 详情如下 错误信息 致命错误 从第 726 行 ro
  • Bootstrap v4 中的“p-N”及其变体代表什么?

    我发现 Bootstrap v4 中的命名不太直观 我知道他们希望最大限度地减少所有类使标记混乱的影响 但我无法得出合理的结论 我可以猜测 但我找不到具体的答案 p 1 p 2 p N Flexbox 相关 但是什么是p代表 d flex
  • 通过代理的 XMLDocument.Load(url)

    我有一些代码基本上使用 XMLDocument Load uri 方法读取 XML 文档 该方法运行良好 但如果通过代理进行调用 则效果不佳 我想知道是否有人知道通过代理进行此调用 或达到相同效果 的方法 这是我最终使用的代码 WebPro
  • 使用 php 绘制图表

    我需要制作图表 饼图和条形图 并使用 php 数据 数据是 JSON 编码的 生成图表的最佳方法是什么 我现在正在查看 Google Chart api 还有什么比这更好 读作 更容易 的吗 pChart http pchart sourc
  • +[NSObject初始化]内部的dispatch_once是否过度杀伤?

    如果我在其中创建一个单例 NSObject initialize 我需要将我的代码放入dispatch once像这样阻止 static NSObject Bar implementation Foo void initialize if
  • 命名管道:C# 服务器、C++ 客户端

    我编写了两对命名管道客户端 服务器程序 C NET 4 中的第一对 C 中的第二对 非托管 所有 4 个测试程序都使用相同的管道名称 pipe mypipe C 对彼此工作得很好 我从客户端发送一条消息 服务器接收该消息 C 对也可以很好地
  • 在 For 循环内使用 IF 条件检查时如何丢弃数据表中的空值

    在我的项目中 我根据数据库中的某些条件选择用户 ID 并将其保存在数据表中 并使用基于条件的用户输入的 ID 进行检查 只会获取 5 行 但在循环中和 IF 条件下 它正在检查第 6 行为空 因此它抛出异常 位置 6 处没有行 我的代码是
  • ie8 和 ie7 的 2 列 div

    我想要一行有 2 个单元格 该行和 2 个单元格必须以百分比表示 我曾尝试这样做 container width 100 display inline table sidebar1 float left width 30 mainConte
  • 如何在 Swift 中正确设置像 imageContacts 这样的圆形 imageView?

    我想在 imageView 中显示图片 就像图像联系人 在圆圈中 但是当我尝试显示它时 imageView 会重新调整其大小 并且在圆圈中无法正确显示 image layer borderWidth 1 0 image layer mask
  • 有哪些重构方法可以减少编译代码的大小?

    我有一个需要新功能的旧固件应用程序 应用程序的大小已经接近设备的有限闪存容量 而少数新功能和变量将其推向极限 打开编译器优化确实可以解决问题 但客户对此持谨慎态度 因为它们过去曾导致过失败 那么 在重构 C 代码以产生更小的输出时 需要注意