经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++20语言核心特性的变化
来源:cnblogs  作者:ChebyshevTST  时间:2023/12/1 9:09:42  对本文有异议

using for Enumeration Values

??对比一下C++20前后的区别:

  1. enum class State {
  2. open,
  3. progress,
  4. done = 9
  5. };
  6. // Before C++20
  7. void print(State s) {
  8. switch (s) {
  9. case State::open:
  10. std::cout << "open\n";
  11. break;
  12. case State::done:
  13. std::cout << "done\n";
  14. break;
  15. case State::progress:
  16. std::cout << "progress\n";
  17. break;
  18. default:
  19. assert(nullptr);
  20. }
  21. }
  1. // Since C++20
  2. void print1(State s) {
  3. using enum State;
  4. switch (s) {
  5. case open:
  6. std::cout << "open\n";
  7. break;
  8. case done:
  9. std::cout << "done\n";
  10. break;
  11. case progress:
  12. std::cout << "progress\n";
  13. break;
  14. default:
  15. assert(nullptr);
  16. }
  17. }
  18. void print2(State s) {
  19. using State::open, State::done, State::progress;
  20. switch (s) {
  21. case open:
  22. std::cout << "open\n";
  23. break;
  24. case done:
  25. std::cout << "done\n";
  26. break;
  27. case progress:
  28. std::cout << "progress\n";
  29. break;
  30. default:
  31. assert(nullptr);
  32. }
  33. }

 

Range-Based for Loop with Initialization

??基于范围的for循环是C++11引入的新特性,自C++20起,基于范围循环也可以进行初始化。

  1. int main() {
  2. std::vector v{1, 2, 3};
  3. for (int i{1}; const auto& item : v)
  4. std::cout << std::format("{}: {}\n", i++, item);
  5. }

 

Feature Test Macros

??特性测试宏,正如其名,是为了当前版本编译器是否支持某个语言特性。这个宏以__cpp为前缀。

  1. #if __cpp_generic_lambdas >= 201707
  2. // generic lambdas with template parameters can be used
  3. #endif
  4. #ifndef __cpp_lib_as_const
  5. template <typename T>
  6. const T& as_const(T& t) {
  7. return t;
  8. }
  9. #endif

 

Attribute [[no_unique_address]]

  1. #include <iostream>
  2. struct Empty {};
  3. struct I {
  4. int i;
  5. };
  6. struct S {
  7. Empty e;
  8. int i;
  9. };
  10. int main() {
  11. std::cout << "sizeof(Empty): " << sizeof(Empty) << '\n';
  12. std::cout << "sizeof(I): " << sizeof(I) << '\n';
  13. std::cout << "sizeof(S): " << sizeof(S) << '\n';
  14. }

空类为了区分不同对象的地址,字节大小是1;而结构体S由于内存对齐的原因,所以字节大小是8。输出结果毫无疑问是1,4,8。

  1. #include <iostream>
  2. struct Empty {};
  3. // EBCO
  4. struct S : Empty {
  5. int i;
  6. };
  7. // no_unique_address
  8. struct S2 {
  9. [[no_unique_address]] Empty e;
  10. int i;
  11. };
  12. int main() {
  13. std::cout << "sizeof(Empty): " << sizeof(Empty) << '\n';
  14. std::cout << "sizeof(S): " << sizeof(S) << '\n';
  15. std::cout << "sizeof(S2): " << sizeof(S2) << '\n';
  16. }

注解标签no_unique_address能起到和空基类优化相同的效果。

 

Attributes [[likely]] and [[unlikely]]

??在if/else,switch分支当中都可以使用,帮助编译器作分支预测的优化。

  1. int f(int n) {
  2. if (n <= 0) [[unlikely]] {
  3. return n;
  4. } else {
  5. return n * n;
  6. }
  7. }
  8. int g(int n) {
  9. if (n <= 0) {
  10. return n;
  11. } else [[likely]] {
  12. return n * n;
  13. }
  14. }
  15. int h(int n) {
  16. switch (n) {
  17. case 1:
  18. //
  19. break;
  20. [[likely]] case 2:
  21. //
  22. break;
  23. }
  24. return 0;
  25. }

 

Attribute [[nodiscard]] with Parameter

??nodiscard用于修饰函数,当被修饰的函数发生调用(仅仅调用而不作赋值或者强制转换操作),编译器会报警告信息。

  1. [[nodiscard]]
  2. int f(int n) {
  3. return n;
  4. }
  5. int main() {
  6. f(1); // Warning
  7. int n = f(1); // OK
  8. reinterpret_cast<int *>(f(1)); // OK
  9. }

 

New Character Type char8_t

  1. using namespace std::literals;
  2. auto c = u8'c'; // char8_t
  3. auto s = u8"Hello World"; // const char8_t *
  4. auto str1 = u8"Hello World"s; // std::u8string
  5. auto str2 = u8"Hello World"sv; // std::u8string_view
  6. std::cout << u8'c' << '\n'; // OK in C++17, error in C++20
  7. std::cout << u8"Hello World\n"; // OK in C++17, error in C++20
  8. std::cout << u8"Hello World\n"s; // OK in C++17, error in C++20
  9. std::cout << u8"Hello World\n"sv; // OK in C++17, error in C++20
  10. std::cout << c << '\n'; // OK in C++17, error in C++20
  11. std::cout << s << '\n'; // OK in C++ 17, error in C++20
  12. std::cout << str1 << '\n'; // OK in C++17, error in C++20
  13. std::cout << str2 << '\n'; // OK in C++17, error in C++20

更多的介绍将在下次带来,感谢支持??

原文链接:https://www.cnblogs.com/ChebyshevTST/p/17868410.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号