Chi*_*roh 2 c++ sse sse4 c++23
我正在阅读一篇关于if consteval (\xc2\xa73.2)的 C++ 论文,并看到一段显示constexpr strlen实现的代码:
constexpr size_t strlen(char const* s) {\n if constexpr (std::is_constant_evaluated()) {\n for (const char *p = s; ; ++p) {\n if (*p == \'\\0\') {\n return static_cast<std::size_t>(p - s);\n }\n } \n } else {\n __asm__("SSE 4.2 insanity"); \n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我是来询问__asm__else分支中的语句的。
我知道这是幽默,并不意味着要认真对待,但我仍然决定做一些研究,以防有人已经解释过。\n当我用谷歌搜索引用的消息时,我得到的结果不到 10 个,全部都是关于这段代码的.\n然后我研究了什么是SSE 4.2,发现它是一个CPU指令集,所以我真的不知道它在C++论文中出现的内容,有人有解释吗?\n感谢那些会阅读的人我的帖子。
\ncigien是正确的:
这是一个占位符,意思是“一些疯狂的 SSE 4.2 东西”:) 这不是真正的指令
虽然公平地说,我不能把这个特别的笑话归功于我,它来自 David Stone 的constexpr 函数参数论文。
这里的重点并不是strlen使用 SSE 指令实现的最佳方法,而是如果您手写程序集,就有一种方法可以做到这一点,这可能会比手动循环更好,等等这样一来,它绝对不是 constexpr 友好的——因此特定的指令列表与问题并不真正相关。无论它是什么,它都无法在编译时工作,因此需要将其切换出去。