关于我是怎么找到MSVC的STL库的std::this_thread::sleep_for是怎么实现的这件事

直接从VS里转到定义

今天阅读C++ Concurrency in Action 2nd Edition-2019,看到第四章:

std::this_thread::sleep_for(std::chrono::milliseconds(100));

突然好奇,这个sleep_for和windows api的Sleep有什么区别?

右键,转到定义:
在这里插入图片描述
发现sleep_for是调用的sleep_until。里面又有一个_Thrd_sleep。又追。
在这里插入图片描述
进入xthreads.h,阿勒,这里只有声明没有定义呢。

追进反汇编

这样,我转成Release(Debug里肯定会塞进一堆乱七八糟的运行时函数,调用的函数也很可能是debug版),再把程序跑起来,从反汇编里追call指令。
在这里插入图片描述
在这里插入图片描述
最后来到了只有地址的荒原。vs毕竟不像ollydbg,没有标出系统api地址。我也懒得用ollydbg,又要处理ASLR基址偏移的问题,麻烦。

如果是对.lib做反汇编呢

我又想了一下,可以找msvcrt的.lib,反编译.lib看它的调用地址。但想了想,反编译出来也不会像ollydbg一样注明api的,也是一串地址。

还是找STL源码算了

那么,哪里能找到STL的源码呢?参考了如何获取 C++ 标准库的源码其实很简单,MSVC的STL库就在github上:https://github.com/microsoft/STL

找到stl/src/cthread.cpp:
在这里插入图片描述
已经看到Sleep函数了,再翻看前面#include <Windows.h>,这就可以完全确定了。

顺便也看到了WaitForSingleObjectEx这些函数,证明MSVC的STL在Windows下也是调用的Windows API。

这步骤看似很无聊,也早有人说过STL底层也是用了系统API,但我这人就是想要彻底确定这件事,拿出证据。

参考

  1. 如何获取 C++ 标准库的源码
  2. https://github.com/microsoft/STL
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值