在阅读文章时,我遇到了以下功能:
SolidColor::SolidColor(unsigned width, Pixel color)
: _width(width),
_color(color) {}
__attribute__((section(".ramcode")))
Rasterizer::RasterInfo SolidColor::rasterize(unsigned, Pixel *target) {
*target = _color;
return {
.offset = 0,
.length = 1,
.stretch_cycles = (_width - 1) * 4,
.repeat_lines = 1000,
};
}
Run Code Online (Sandbox Code Playgroud)
作者用return语句做了什么?我之前没有见过这样的东西,我不知道如何搜索它...它对普通C也有效吗?
编辑: 链接到原始文章
最近我意识到我的可执行文件的大小相当大。我正在使用 Eclipse 和 GCC 为 Cortex-M 微控制器开发软件。
为了验证这一点,我使用了在互联网上找到的一个示例项目,该项目只是通过直接操作寄存器来使 LED 闪烁,并且基于 makefile。
我使用我的库、启动代码、链接器脚本等创建了一个非常相似的项目,该项目使用 Eclipse 的托管 makefile。
第一个项目编译成功,并生成了app.txt的二进制文件。6kB。第二个项目产生了app.48kB的二进制文件!对于本质上相同的结果来说,这显然是一个相当大的差异,而且后者绝对是一个巨大的文件,只是让 LED 闪烁。在这两种情况下,优化都被关闭。
在我自己的库中,有一些易失性缓冲区,这可能是大型 BSS 或数据部分的借口,因此我决定首先关注文本部分(仍然是 5 倍大,从 5kB 到 27kB)。
我查看了映射文件以了解与二进制文件真正链接的内容。相同或相似的功能也具有相似的大小。
有一件事情对我来说似乎非常非常奇怪。有些函数在整个项目中仅定义一次,但似乎已链接多次,每次都来自不同的目标文件,并且每次都占用文本部分中的空间。看一下函数的例子.text.port_lock。
这是正常的吗?如何减少最终文件大小,以及如何告诉工具链每个函数仅链接一次?
编辑: 正如评论中所述,这两个程序没有不同,它是同一件事,只是做了一些小的修改(例如启动代码和访问 GPIO 寄存器的函数)。我不是在测试GCC优化代码的能力,因此我使用了-O0。我尝试理解地图文件,以及为什么我多次看到某些功能。