问题标签 [code-size]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
320 浏览

loops - 当必须使用循环命令时,无论如何要增加循环命令的范围

我收到错误代码,说跳转太长了 5 个字节,指的是外循环。我知道只使用 jmp 命令并自己跟踪计数器会更简单,但我的家庭作业要求使用循环来代替。有没有办法扩展循环的范围,或者有没有办法将循环中的内容缩小 5 个字节,而我没有看到?

循环应该检查一个数字是否是复合的,只是为了知道功能。

0 投票
1 回答
1198 浏览

c++ - C++ 模板 - 代码使用、二进制文件大小

我想知道模板代码的代码大小。请考虑以下代码

当我有两个向量实例时,

它会被编译成具有两个push_back实现的二进制文件吗

还是只有一个,还是别的什么?

是否可以使用模板来减少代码大小,而不是为floatint向量创建单独的类?

0 投票
1 回答
148 浏览

c++ - std::array 模板实例会占用更多的代码内存吗?

我有一个没有 MMU 的微控制器,但我们使用的是 C 和 C++。

我们正在避免所有动态内存使用(即 no new SomeClass()or malloc())和大多数标准库。

半问题0:

据我了解std::array,它不使用任何动态内存,所以它的使用应该没问题(它只在堆栈上)。查看std::array源代码,它看起来不错,因为它创建了一个 c 样式的数组,然后在该数组周围包装了功能。

我们使用的芯片有 1MB 的闪存用于存储代码。

问题一:

我担心在其中使用模板std::array会导致二进制文件变大,这可能会导致二进制文件超过 1MB 代码内存限制。

我认为,如果您创建 a 的实例std::array< int, 5 >,那么对其上的所有函数调用都std::array将占用一定数量的代码内存,比如说 X 字节的内存。

如果您创建另一个实例std::array< SomeObject, 5 >,然后调用该实例的函数std::array,这些函数中的每一个现在是否会在二进制文件中重复,从而占用更多代码内存?X 字节内存 + Y 字节内存。

如果是这样,您认为在代码存储容量有限的情况下生成的代码量是否值得关注?

问题2:

在上面的示例中,如果您创建了第二个std::array< int, 10 >实例,对函数的调用是否也会复制生成代码中的函数调用?即使两个实例属于同一类型,int?

0 投票
2 回答
4091 浏览

c - 制表符和空格如何影响 C 中的代码大小

在嵌入式系统上工作时,内存的每个字节都很重要,在 C/C++ 程序中,当您使用 4 个空格而不是 1 个制表符时,生成的代码大小有什么不同吗?

0 投票
1 回答
269 浏览

c++ - 为什么简单使用 ostringstream 会生成这么多汇编代码?

考虑以下简单示例,该示例使用ostringstream并丢弃输出来格式化字符串和整数:

编译它会clang++ -S -O3 -DNDEBUG -std=c++14 test.cc生成大量的汇编代码(x86-64 指令中的半千字节,而类似sprintf代码的不到一百字节) - 请参见下面的输出。为什么它会生成这么多代码,是ostringstreamAPI 固有的还是这个特定的编译器/库做错了什么?

0 投票
1 回答
158 浏览

assembly - 对寄存器中的位进行计数的最小代码大小循环(递减另一个寄存器)?

我需要在 8086* 程序集中尽可能短(小于 10 个字节)编写以下 C 代码片段,但我只能设法将其写入 12 个字节。

有任何想法吗?

0 投票
2 回答
722 浏览

c - C 如何减小程序大小

我正在为 uController 编写 ac 程序,我设法用代码填充了 32kb。

该程序充满了以下“打印”功能:

SerialWrite 看起来像:

我用字符串文本调用 print 函数作为参数,例如:

我只使用了 32kb 外部存储器中的 2.2kb,所以我的结论是将“Hello World”移动到外部存储器,而不是在主程序中硬编码。

不幸的是,我的尝试实际上使情况变得更糟,我做了以下事情:

比我试过的:

这确实将外部内存大小增加了 12,这是正确的,因为字符串包含 11 个字符 + 空值。但程序内存也增加了 3。我尝试了不同的字符串长度,但程序内存不断增加 3 个字节。

我怎么解决这个问题?

另外:我正在使用 Keil 的 C 编译器,并且我在编译时有利于程序大小。uController 是一个 FPGA 芯片,具有仿真的 80C51 芯片。对于这个虚拟 80c51,我正在编写代码。我有 32kb 内存用于主程序,32kb 用于变量

编辑: *msg[] 是一个错字,它必须是 *msg

0 投票
1 回答
51 浏览

c++ - 为什么?更改构建结构后,可执行文件大小显着减小

我在我的个人 C++ 项目中构建了一个简单的编译器,称为simplecc。今天,我对其进行了重构,这改变了主可执行文件的构建方式,或者如我所说,构建结构和可执行代码大小下降了近一半。

我的项目有很多组件,例如ASTCodeGen,它们以它们的功能命名。每个组件都驻留在自己的文件夹中(标题和 cpp 都有)。有一个lib/目录包含所有其他组件的目录,并且一个CMakeList.txtinlib/生成单个可执行文件simplecc现在这里有区别。

旧代码:

新代码:

在每个子目录中,从该组件的源代码构建一个静态库(存档)。最后,这些档案被链接到可执行文件中。

虽然我认为我只是组织了代码以便更好地跟踪它cmake,但它大大减少了可执行文件的代码大小!剥离后的旧代码是14M和3.7M。新代码剥离前为2.4M,剥离后为5.6M,剥离后为560K。这怎么可能发生?一般是真的吗?它是特定于项目的吗?我的项目广泛使用CRTP

编辑:这些数据来自调试版本。我还没有完成发布版本(稍后会添加)。

0 投票
2 回答
1046 浏览

linux - Print newline with as little code as possible with NASM

I'm learning a bit of assembly for fun and I am probably too green to know the right terminology and find the answer myself.

I want to print a newline at the end of my program.

Below works fine.

But I'm hoping to achieve the same result without defining the newline in .data. Is it possible to call sys_write directly with the byte you want, or must it always be done with a reference to some predefined data (which I assume is what mov rsi, newline is doing)?

In short, why can't I replace mov rsi, newline by mov rsi, 10?

0 投票
1 回答
1341 浏览

assembly - 从 32 位 x86 汇编代码中读取程序的字节数的方法是什么

我正在做一个简单的堆栈粉碎练习。我需要在我的程序集中写入一个特定偏移量的短跳。我需要通过两条指令分隔的字节数来计算偏移量。

我一直在搜索谷歌,但我似乎无法获得正确的搜索词。

例如,我知道mov操作码是 2 个字节。但是整个指令有多少字节取决于你srcdest......你是使用立即值还是偏移量,寻址模式是什么等等。

我知道在某个地方必须有一个图表或其他东西,我可以用它来计算这个。

Aleph One's Smashing the Stack for Fun and Profit 的第 12 页显示了我正在尝试做的事情(从汇编代码中计算字节数):http ://www-inst.eecs.berkeley.edu/~cs161/fa08/papers/stack_smashing .pdf