怎么通过 VS2019 看 strlen()的源码?
source link: https://www.v2ex.com/t/825671
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
vs 工程里,写了这么一句strlen("123");
,然后我按住 ctrl ,点 strlen 进去,是这个样子:
如上图,我依次点击 strlen ,_In_z_,_SAL2_Source_,_SA_annotes3 到最后这个_SA_annotes3 这个宏定义,我就懵了,它还有三种宏定义。
而且这个过程,宏定义又包含宏定义的,太复杂了吧,我只是想看一下 strlen 的实现而已。( PS:突然怀念起以前看 java 源码的日子)
所以我这么看源码是对的吗?还是说,我不应该在 VS 里面看 C 的源码阿?(可能以后还想看一下 c++库,比如 vector 的实现)
第 1 条附言 · 1 天前
但标准 C++库 vector 这种,你们都是怎么看源码的啊?比如你想看一下 vector 的拷贝构造函数和赋值构造函数是怎么实现的?深拷贝还是浅拷贝?
VS 里倒是也能看,或者我应该去看 glibc 的源码或者 llvm 的源码?毕竟基本都是在 linux 上开发 C++
x1596357 1 天前 2
size_t __cdecl strlen( const char *str )
{
const char *s = str;
while (*s) s++;
return s - str;
}
amiwrong123 1 天前
好吧,我也不是非得通过,msvc 的方式来看源码的。
那问下层主,有没有别的方式,可以方便看 c 或 c++源码的?最好是 能通过 ctrl 点击跳转这种形式。(把 https://github.com/microsoft/STL 下载下来,然后用 sublime 打开,再用一个跳转插件,好像也能实现)
或者说,你们平时看 c 或 c++源码,都是通过什么方式来看的呀?
iQXQZX 1 天前
kokutou 1 天前 via Android
把 gcc llvm 搞到 Windows 上呗。。。
skinny 1 天前
去那个目录里面去找,不过不全
amiwrong123 1 天前
ipwx 1 天前 1
https://github.com/lattera/glibc/blob/master/string/strlen.c#L33
你看这个实现, /* Instead of the traditional loop which tests each character,
we will test a longword at a time. The tricky part is testing
if *any of the four* bytes in the longword in question are zero. */
ipwx 1 天前
First CRT's one is written directly in assembler. you can see it's source code here C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\intel\strlen.asm (this is for VS 2008)
msg7086 1 天前
比如楼上贴的深度位运算优化,或者是根据 CPU 型号跑 SSE 或者 AVX 指令集等等。
O3 编译完的汇编代码可能连亲妈都不认识了。
amiwrong123 1 天前
amiwrong123 1 天前
sujin190 1 天前
Jooooooooo 1 天前
LUO12826 1 天前
rainciousEatDung 1 天前
中二时代:试图搞明白 C 语言的原理,从了解到懵逼。
大学时代:《编译原理》《微机原理》,从上课到挂科。
yolee599 1 天前 via Android
ysc3839 1 天前 via Android
https://github.com/microsoft/STL 是把以前就已经公开 msvcrt 的代码中的 STL 部分换成了开源协议。
至于你说的 点进去的那个只是声明,因为 VS 不知道去哪找源代码,你需要手动打开源代码。_In_z_ 是微软的 SAL 语法,用来描述参数传递的要求的,给代码检查工具用的。
jinliming2 1 天前 1
我之前看过一篇文章,讲的是 Linux 下的 yes 命令的实现: https://endler.dev/2017/yes/
yes 命令很简单,就是无限循环输出字母 y 。类似于 while (true) { println("y"); }
就这么一个命令,都做了一大堆优化手段,可想而知 strlen 这么“复杂”且在系统中高频使用的函数会需要优化到什么程度……
billwsy 21 小时 39 分钟前 via iPhone
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK