Skip to content

docs(cpp): 补充 ch03 参数传递练习参考答案 - #201

Merged
Charliechen114514 merged 2 commits into
Awesome-Embedded-Learning-Studio:mainfrom
xiaoshuaijie:ch03-2
Sep 3, 2026
Merged

docs(cpp): 补充 ch03 参数传递练习参考答案#201
Charliechen114514 merged 2 commits into
Awesome-Embedded-Learning-Studio:mainfrom
xiaoshuaijie:ch03-2

Conversation

@xiaoshuaijie

Copy link
Copy Markdown
Collaborator

变更类型

  • 现有文章改进
  • 社区来稿初刊
  • 翻译或双语同步
  • 其他

变更背景

完善《参数传递方式》一章的练习部分,为已有的三个练习补充可运行的参考答案,帮助学习者完成练习后进行自查,并进一步理解值传递、引用传递、const 引用和函数返回值生命周期等概念。

具体改动

修改文件:

  • documents/vol1-fundamentals/ch03/02-pass-by-value-ref.md

新增内容:

  1. 练习一:实现 swap

    • 实现交换两个 double 值的 swap_values 函数。
    • 添加 std::string 重载版本。
    • 提供完整的 main 函数、编译命令和运行结果。
  2. 练习二:高效处理大型结构体

    • 定义包含 1000 个 double 元素的 Measurement
    • 分别实现值传递和 const 引用传递版本的平均值计算函数。
    • 使用 std::chrono 对两种传递方式进行简单性能对比。
    • 说明基准测试结果会受到编译器、硬件和系统调度影响,不应机械比较固定耗时。
  3. 练习三:修复悬垂引用

    • 修复返回局部变量引用导致的未定义行为。
    • 将函数修改为按值返回 std::string
    • 补充局部变量生命周期、悬垂引用以及 RVO/移动操作相关说明。
    • 提供完整编译运行示例和预期结果。

教学效果

本次补充覆盖了以下知识点:

  • const 引用用于修改调用者对象。
  • 函数重载在不同参数类型下的使用。
  • 大型对象值传递产生的拷贝成本。
  • const T& 在只读场景下的使用方式。
  • 局部变量生命周期与悬垂引用。
  • 函数按值返回的安全性和现代编译器优化。

所有参考答案均使用 ::: details 参考答案 折叠展示,不会影响学习者先独立完成练习。

验证方式

  • git diff --cached --check
  • 使用 g++ 8.1.0 编译并运行练习一示例:
    g++ -std=c++17 -Wall -Wextra
  • 使用 g++ 8.1.0 编译并运行练习二示例:
    g++ -std=c++17 -O2 -Wall -Wextra
  • 使用 g++ 8.1.0 编译并运行练习三示例:
    g++ -std=c++17 -Wall -Wextra
  • pnpm build
  • 全量 Markdown lint

练习二的平均值计算结果为 500.5Measurement 大小为 8000 字节;练习三运行结果为 user_admin

影响范围

本 PR 仅影响:

  • Vol.1 Fundamentals
  • Chapter 3:函数与参数传递
  • 《参数传递方式》练习区

未修改导航、frontmatter 或其他章节内容。

关联 Issue / Discussion

暂无。

@Charliechen114514 Charliechen114514 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

反馈了一些建议级别的讨论,可以跟我聊聊您的看法~


int main()
{
constexpr int kIterations = 100000;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

嗯嗯,看到了,但是constexpr出现在这里可能还是会对不熟悉的朋友造成一定的阅读困扰,可以的话换成宏先,然后在答案的后面说明一下,宏,经典的static const和constexpr之间的差异会更好

user_admin
```

原代码中的 `prefix` 是普通局部变量,只在 `get_prefix` 函数执行期间存在。函数返回时,它的生命周期结束,返回的 `const std::string&` 便指向已经销毁的对象,后续通过这个引用读取数据就是未定义行为。

@Charliechen114514 Charliechen114514 Sep 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

嗯,这里可以补充一下,这是一种答案,但是实际上C++中,特别是在嵌入式里,很少会按值返回(当然现在C++17后NRVO强制了,其实这样写也OK)。编译器的行为约束从会倾向于移动(也就是把构造的资源不释放,从函数中直接把对象直接保留而不是销毁),但是返回值可能一些嵌入式的朋友会有疑问~,可以再补充下入参的引用形式~

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个是建议哈,不构成阻塞

@xiaoshuaijie

Copy link
Copy Markdown
Collaborator Author

已换成宏定义和取消const对NRVO移动语义的干扰

@Charliechen114514

Copy link
Copy Markdown
Member

可以,approve了

@Charliechen114514
Charliechen114514 merged commit 1e45f61 into Awesome-Embedded-Learning-Studio:main Sep 3, 2026
5 checks passed
@xiaoshuaijie
xiaoshuaijie deleted the ch03-2 branch September 4, 2026 06:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants