主页

c++ stl unordered_map 的扩容机制

gcc的扩容机制 https://github.com/gcc-mirror/gcc/blob/master/libstdc++-v3/src/c++11/hashtable_c++0x.cc#L104 gcc 的做法是按 growth_factor (=2) 来扩容, if (__n_elt + __n_ins > _M_next_resize) { // If _M_next_resize is 0 it means that we have nothing allocated so // far and that we start inserting elements. In this case we start // with an ini...

阅读更多

url输入网址,到渲染页面,发生了什么

当用户在浏览器的地址栏中输入一个URL(网址)并按下回车键后,以下是通常发生的步骤: URL解析:浏览器会解析URL,将其分解成几个组成部分,包括协议(如HTTP、HTTPS)、域名(或IP地址)、端口号、路径和查询参数等。 DNS解析:浏览器将解析出的域名发送给DNS服务器,以获取对应的IP地址。DNS服务器将返回与域名对应的IP地址,供浏览器后续使用。 建立TCP连接:浏览器使用获取到的IP地址和端口号,与服务器建立TCP连接。这是通过三次握手来确保客户端与服务器之间的可靠连接。 发起HTTP请求:一旦TCP连接建立,浏览器会发送HTTP请求。请求包括请求方法(如GET、POST)、请求头(包含用户代理、...

阅读更多

从socket的角度解释TCP的连接建立过程

TCP连接建立过程可以分为三个阶段,分别是:建立连接阶段、数据传输阶段和关闭连接阶段。下面从socket的角度解释TCP连接建立过程: 建立连接阶段: 在socket编程中,当客户端调用connect函数时,会向服务器发送一个SYN包,表示请求建立连接。服务器收到SYN包后,会回复一个SYN+ACK包,表示同意建立连接,并告诉客户端自己的序列号。客户端收到SYN+ACK包后,会回复一个ACK包,表示确认建立连接,并告诉服务器自己的序列号。此时,TCP连接建立成功,可以进行数据传输。 数据传输阶段: 在socket编程中,当客户端调用send函数发送数据时,数据会被分成多个TCP报文段进行传输。每个TCP报文段都会带有序列号和确认号,用于保证数据的可靠传输。服务器收到数据后,会发送一...

阅读更多

cpp17 新特性string_view

引入 单独的头文件<string_view> 实现 只读的,指针+ 长度, 不拥有内容 immutable, light weight (pointer + size), does NOT own the content. struct string_view { const char* data; size_t length; } libstdc++-v3/include/std/string_view 使用 most interfaces remain the same as std::string, e.g. [], begin, at, back, data 大部分操作和std::string 一致 findsubstr O(1) s...

阅读更多

c++ dynamic_cast 底层实现

底层实现 dynamic_cast 的底层实现涉及两个主要的机制:虚函数表(vtable)和运行时类型信息(RTTI)。 1. 虚函数表(vtable): 虚函数表是用于实现多态性的一种机制。它是一个存储在对象内存布局中的特殊表格,用于存储虚函数的地址。每个具有虚函数的类都有一个对应的虚函数表。虚函数表中的每个条目对应一个虚函数,包含了函数的地址。派生类的虚函数表会继承基类的虚函数表,并可以在其中添加或重写虚函数。 2. 运行时类型信息(RTTI): 运行时类型信息是用于在运行时获取对象的实际类型的机制。C++ 中的 RTTI 通过 type_info 类型和 typeid 运算符来实现。每个具有虚函数的类都会自动生成一个与之对应的 type_info 对象,其中包含了类的名称和...

阅读更多

stl "vector" 特殊优化

vector 特性 std::vector 是 std::vector 对类型 bool 为空间提效的特化。 std::vector 中对空间提效的行为(以及它是否有优化)是实现定义的。一种潜在优化涉及到 vector 的元素联合,使得每个元素占用一个单独的位,而非 sizeof(bool) 字节。 std::vector 表现类似 std::vector ,但为节省空间,它: 不必作为连续数组存储元素 暴露类 std::vector::reference 为访问单个位的方法。尤其是,此类型的类为 operator[] 以值返回。 不使用 std::allocator_traits::construct 构造位值。 不保证同一容器中的不同元素能由不同线程同时修改。 api文...

阅读更多