小编Fot*_*los的帖子

C++中的奇怪语法:return {.name = value,...}

在阅读文章时,我遇到了以下功能:

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也有效吗?

编辑: 链接到原始文章

c++ return

22
推荐指数
2
解决办法
1494
查看次数

了解地图文件,优化大小

最近我意识到我的可执行文件的大小相当大。我正在使用 Eclipse 和 GCC 为 Cortex-M 微控制器开发软件。

为了验证这一点,我使用了在互联网上找到的一个示例项目,该项目只是通过直接操作寄存器来使 LED 闪烁,并且基于 makefile。

我使用我的库、启动代码、链接器脚本等创建了一个非常相似的项目,该项目使用 Eclipse 的托管 makefile。

第一个项目编译成功,并生成了app.txt的二进制文件。6kB。第二个项目产生了app.48kB的二进制文件!对于本质上相同的结果来说,这显然是一个相当大的差异,而且后者绝对是一个巨大的文件,只是让 LED 闪烁。在这两种情况下,优化都被关闭。

在我自己的库中,有一些易失性缓冲区,这可能是大型 BSS 或数据部分的借口,因此我决定首先关注文本部分(仍然是 5 倍大,从 5kB 到 27kB)。

我查看了映射文件以了解与二进制文件真正链接的内容。相同或相似的功能也具有相似的大小。

有一件事情对我来说似乎非常非常奇怪。有些函数在整个项目中仅定义一次,但似乎已链接多次,每次都来自不同的目标文件,并且每次都占用文本部分中的空间。看一下函数的例子.text.port_lock

这是正常的吗?如何减少最终文件大小,以及如何告诉工具链每个函数仅链接一次?

地图文件

编辑: 正如评论中所述,这两个程序没有不同,它是同一件事,只是做了一些小的修改(例如启动代码和访问 GPIO 寄存器的函数)。我不是在测试GCC优化代码的能力,因此我使用了-O0。我尝试理解地图文件,以及为什么我多次看到某些功能。

c linker gcc makefile compilation

2
推荐指数
1
解决办法
7644
查看次数

标签 统计

c ×1

c++ ×1

compilation ×1

gcc ×1

linker ×1

makefile ×1

return ×1