<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[binarch的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/binarch</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; binarch]]></copyright><item><title><![CDATA[《Effective C++ 改善程序与设计的55个具体做法》读书笔记]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131586086</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131586086</guid><author>binarch</author><pubDate>Thu, 06 Jul 2023 21:54:39 +0800</pubDate><description><![CDATA[尽可能延后变量定义式的出现。这样做可增加程序的清晰度并改善程序效率。绝对不要重新定义继承而来的函数。绝对不要重新定义一个继承而来的缺省参数值，因为缺省参数值是静态绑定，而virtual函数——你唯一应该覆写的定西——确是动态绑定。当编写一个，而它所提供的“与此template相关的”函数支持“所有参数之隐式类型转换”时，请将那些函数定义为“内部的friend函数”。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：如何避免死锁？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131544970</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131544970</guid><author>binarch</author><pubDate>Tue, 04 Jul 2023 22:52:46 +0800</pubDate><description><![CDATA[二师兄：当进程A持有锁1请求锁2，进程B持有锁2请求锁1时，两者都不会释放自己的锁，两者都需要对方的锁，就会造成死锁。二师兄：在C++中，锁（Lock）是一种同步工具，用于保护共享资源，防止多个线程同时访问，从而避免数据竞争和不一致。二师兄：在C++11之前，C++便准层面并没有定义锁，锁的应用要依赖于平台。1.避免循环等待，如果需要在业务中获取不同的锁，保证所有业务按照相同的顺序获取锁。二师兄：从种类上分，可以分为普通锁、读写锁、递归锁等种类。2.使用超时锁，当锁超时时，自动释放锁。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：如何实现一个strncpy函数？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131524726</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131524726</guid><author>binarch</author><pubDate>Mon, 03 Jul 2023 22:16:19 +0800</pubDate><description><![CDATA[是一种常见的并行计算技术，一条指令可以同时处理多个数据，所以它可以减少指令的数量，从而提高处理速度。每次可以复制超过一个字节的内容，当数据量大的时候，效率会有明显的提升。二师兄：主要用做字符串复制，将于字符从一个位置复制到另一个位置。有没有什么办法对以上的代码做一些性能上的优化？是程序员传入进来的，且无法知晓dest的长度，所以这个。比如利用指针的自增？面试官：好的，今天就到这里，请回去等通知吧。二师兄：只是听说过，没有用过。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：技术勘误]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131496035</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131496035</guid><author>binarch</author><pubDate>Sat, 01 Jul 2023 23:33:28 +0800</pubDate><description><![CDATA[这里的erase返回的是下一个迭代器，然后++就是下下个迭代器，跳过了下个迭代器。不知不觉，《C++面试八股文》已经更新30篇了，这是我第一次写技术博客，由于个人能力有限，出现了不少纰漏，在此向各位读者小伙伴们致歉。不仅帮助我改正了文章中的错误，也让我有机会更新和修正自己的知识储备库。同时不同编译器对标准的实现也不尽相同，这增加了C++学习者的负担。二师兄：不可以，因为构造函数在对象构造阶段调用，虚表尚未建立，所以无法调用虚函数实现多态。为了不误导更多的小伙伴，以后会不定期的出勘误文章，请各位小伙伴留意。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：什么是空指针/野指针/悬垂指针？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131485103</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131485103</guid><author>binarch</author><pubDate>Fri, 30 Jun 2023 23:31:04 +0800</pubDate><description><![CDATA[二师兄：野指针突出一个野字，这个野就是状态未知的。二师兄：垂悬指针是指指针指向的内容已被释放，指针指向的对象的生命周期已结束。4.要注意长生命周期的指针不能指向短生命周期的对象。二师兄：内存泄漏是指分配的内存空间没有被正确释放的情况。1.在解引用指针之前，要判断指针是否为空。（解决空指针解引用问题）空指针不能被解引用，但是可以对空指针取地址。定义空指针，因为它时有类型的，编译器能够对它进行类型检查。），使用C++的构造和析构机制保证资源的正确申请和释放。面试官：如何解决空指针、野指针、垂悬指针带来的问题？]]></description><category></category></item><item><title><![CDATA[C++面试八股文：什么是构造函数？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131466263</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131466263</guid><author>binarch</author><pubDate>Thu, 29 Jun 2023 23:09:25 +0800</pubDate><description><![CDATA[二师兄：构造函数是一种特殊的成员函数，用于创建和初始化类的对象。二师兄：没有任何参数的构造函数（所有参数都要默认参数的构造函数也是）。C++类的构造函数的基本考点都在这里了，小伙伴本要理解这些设计及设计背后的取舍，面对面试官的拷问才能对答如流哦。），将不被初始化，如果是类类型，将执行类类型的的默认构造函数初始化变量。二师兄：类类型的初始化时一个循环的过程，如果类类型中有类类型成员，初始化方式和以上描述的一致。二师兄：不可以，因为构造函数在对象构造阶段调用，虚表尚未建立，所以无法调用虚函数实现多态。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：知道std::unordered_set/std::unordered_map吗？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131446373</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131446373</guid><author>binarch</author><pubDate>Wed, 28 Jun 2023 22:45:28 +0800</pubDate><description><![CDATA[二师兄：两者底层使用哈希表实现，因此插入、删除和查找操作的平均时间复杂度为常数时间。值，同时还要告诉编译器如何判断两个自定义类型的对象是否相等。二师兄：这里是平均的时间复杂度。来代替仿函数，目的都是为了使得编译器知道如何计算自定义类型的哈希值。好了，今天的面试到这里就结束了，让我们期待明天面试官的表现吧~面试官：好的，今天的面试就结束了，请回去等消息吧。，真的没有那么多好问题，因为两者太像了。适用于需要有序存储和快速查找的场景，而。的时候，需要告诉编译器如何计算此类型的。适用于需要快速插入和查找的场景。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：用过std::set/std::map吗？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131427141</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131427141</guid><author>binarch</author><pubDate>Tue, 27 Jun 2023 23:28:47 +0800</pubDate><description><![CDATA[红黑树是一种自动平衡的二叉树，它确保插入、删除和查找操作的时间复杂度都是。是一个有序的集合，其中的元素是唯一的，即每个元素只能出现一次。面试官：按照你的方法，可以实现从小到大的排序。这里二师兄的是标准答案，实际上当数据量特别大的时候，的确。类模板的第二个模板参数可以传入比较类型，默认比较类型是。当数据量小的时候，算法的优势没有抵消缓存的劣势，所以。面试官：最后一个问题，你觉得单纯的查询而言，是。面试官：好的，今天面试结束了，回去等通知吧。指针，解引用赋值）会造未知的错误。称为有序容器，所以对插入进去的。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：std::deque用过吗？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131406754</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131406754</guid><author>binarch</author><pubDate>Mon, 26 Jun 2023 22:43:06 +0800</pubDate><description><![CDATA[的底层容器，让我们比较一下三个容器的差异：(只考虑头插和尾插，因为stack不需要随机插入)二师兄：因为使用它的场景很少，大部分需要性能、且需要自动扩容的时候使用。中还有未被元素填充的位置，则将元素填充到数组中，如果此指针指向的。今天的面试分享到这里就结束了，让我们继续期待二师兄的表现吧。从上表中看到，三种容器的插入和是删除的时间复杂度相同。，插入要分情况，如果是头插和尾插，时间复杂度为。会找到头部或尾部的指针，并通过指针找到对应的。二师兄：说实话，很少用，基本没用过。，需要随机插入和删除的时候可以使用。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：std::array如何实现编译器排序？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131387185</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131387185</guid><author>binarch</author><pubDate>Sun, 25 Jun 2023 22:22:49 +0800</pubDate><description><![CDATA[二师兄：区别不是很大，原生数组（非动态数组）和std::array都在栈上开辟空间，初始化的时候需要提供数组长度，且长度不可改变。对于文中出现的技术性错误，我们会不定期的推出勘误文章。C++是一门艰深的语言，让我们和二师兄一起精进吧。面试官：如果一个类型的拷贝构造函数和拷贝赋值运算符是被删除的，可以使用。）空数组的长度应该是0，但是长度为0的。的内存分配在栈上，编译时候确定需要在栈上开辟的空间。对象，而只能传递这个对象的引用或指针。，我们可以在编译时求它所以元素的和。面试官：好的，不错，回去等通知吧。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：std::vector和std::list，如何选择？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131365123</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131365123</guid><author>binarch</author><pubDate>Sat, 24 Jun 2023 18:44:51 +0800</pubDate><description><![CDATA[它的底层是单向链表，引入它的主要目的是为了达到手写链表的性能。指针指向的对象，而不需要移动元素的位置，所以不会导致迭代器失效。这里二师兄回答的倒是没有毛病，但是没有考虑到缓存问题。底层采用数组存储数据，所以它的空间局部性更好，对缓存更友好（被称为双向链表，和C中手写双向链表本质上没有大的区别。二师兄：并不会，因为在任意位置添加和删除元素只需要改变。在随机插入数据不会导致数据的搬移。二师兄：不是，GCC中的实现只有在。二师兄：与手写双向链表不同的是，]]></description><category></category></item><item><title><![CDATA[C++面试八股文：std::vector了解吗？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131355705</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131355705</guid><author>binarch</author><pubDate>Fri, 23 Jun 2023 23:34:47 +0800</pubDate><description><![CDATA[的实现和其他实现容器的实现不一致。时，需要开辟一块更大的动态数组，并把旧动态数组上的元素搬移到当前动态数组，然后销毁旧的动态数组。删除数据时，被删除数据后面的数据依次向前移一位。这会导致被删除数据之后的迭代器失效。在GCC中，如果插入的元素是右值，两者都会。二师兄：这个值在不同的编译器上不是固定的。面试官：你知道新开辟的动态数组的容量是就数组的多少倍比较合适？记录当前元素的数量和当前动态数组的容量。二师兄：有的，如果知道数据的大概量，我们可以使用。被用尽而导致的多次的数据搬移，从而提升。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：override和finial关键字有什么作用？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131345608</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131345608</guid><author>binarch</author><pubDate>Thu, 22 Jun 2023 23:40:53 +0800</pubDate><description><![CDATA[二师兄：大多数人认为，虚函数的调用会先通过虚指针跳到虚函数表，然后通过偏移确定函数真实地址，再跳转到地址执行，是间接调用导致了性能损失。）是指在继承层次结构中，如果两个不同的子类B和C继承自同一个父类A，而又有一个类D同时继承B和C，这种继承关系被称为菱形继承。关键字告诉编译器，这个函数一定会重写父类的虚函数，如果父类没有这个虚函数，则无法通过编译。），在调用函数的时候，会通过虚指针转到虚表，并根据虚函数的偏移得到真实函数地址，从而实现多态。二师兄：虚函数允许在基类中定义一个函数，然后在派生类中进行重写（]]></description><category></category></item><item><title><![CDATA[C++面试八股文：用过STL吗？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131335510</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131335510</guid><author>binarch</author><pubDate>Wed, 21 Jun 2023 23:42:30 +0800</pubDate><description><![CDATA[首先是分配器，主要是为容器分配管理内存的。其次是迭代器，是容器和算法的桥梁。再次是仿函数，一般用作算法中，适配器提供各种粘合剂的功能，把不同部件之间的接口连接起来。二师兄：分配器主要用于内存的分配与释放。中做很多事情，比如我们可以统计申请和释放内存的总量，可以申请一块大内存做内存池等等。二师兄的C++面试之旅，明天继续。二师兄：STL中容器的数量比较多，按照类型可以分为顺序容器和关联容器。，通过调用容器的接口，实现适配器所需的功能。二师兄：（每天都用好吗。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：static_cast了解一下？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131317526</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131317526</guid><author>binarch</author><pubDate>Tue, 20 Jun 2023 23:20:38 +0800</pubDate><description><![CDATA[二师兄：隐式转换的优势是代码简洁。但是有很大缺陷，有些情况隐式转换的结果和程序员的意图不一致，会导致难以发现的问题。二师兄的C++面试之旅，明天继续。既然已经有C风格的类型转换，C++11为什么还要引入新的类型转换关键字？二师兄：C++支持C风格的类型转换，并在C++11引入新的关键字规范了类型转换。隐式转换是指在表达式中自动进行的类型转换。用途最广泛，除了后面三种类型转换外，其他的类型转换都能使用。二师兄：主要有三点，更安全、更灵活、可读性更好。二师兄：C++11引入四种新的类型转换，分别是。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：什么是智能指针？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131296948</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131296948</guid><author>binarch</author><pubDate>Mon, 19 Jun 2023 23:01:23 +0800</pubDate><description><![CDATA[二师兄：Foo中有一个智能指针指向Goo，而Goo中也有一根智能指针指向Foo，这就是循环引用，我们可以使用weak_ptr来解决这个文通。二师兄：智能指针是C++11引入的类模板，用于管理资源，行为类似于指针，但不需要手动申请、释放资源，所以称为智能指针。二师兄：是因为如果返回的裸指针被释放了，智能指针持有的资源也失效了，对智能指针的操作是未定义的行为。的原子变量，原子变量在自增自减时是线程安全的，这保证了多线程读写智能指针时是安全的。面试官：好的，今天的面试结束了，请回去等通知吧。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：std::string是如何实现的？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131275105</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131275105</guid><author>binarch</author><pubDate>Sun, 18 Jun 2023 19:25:53 +0800</pubDate><description><![CDATA[针对字符串比较少的情况，一般编译器会做一些优化，你知道如何优化的吗？今天二师兄的表现不错，除了最后一个问题，基本上都答上来了。针对字符串比较少的情况，一般编译器会做一些优化，你知道如何优化的吗？的内容的长度，以此长度申请一块新内存，然后把当前字符串的内存和。内部维护一个指针，这个指针指向真正的字符串的位置。的时候一般会预先申请一块大的内存，这块内存的长度是。时，在内存中申请一块内存，这块内存的起始地址保存在。面试官：好的，今天的面试结束了，请回去等通知吧。，当添加的字符串的长度加上当前的字符串长度小于。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：聊一聊指针？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131265169</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131265169</guid><author>binarch</author><pubDate>Sat, 17 Jun 2023 21:59:40 +0800</pubDate><description><![CDATA[二师兄：回到问题，我觉得指针的本质就是内存地址。虽然指针指向一块内存地址，但它同时也是一个变量，也可以对指针取地址。如果有一块容量是1G的内存，假设它的地址是从。）,如果把这个内存地址存起来，那么指向这个内存地址的变量的类型就是二级指针（抛开内存的利用率不说，这是一个非常美妙的实现！二师兄：操作系统会再分配一块内存，这块内存的大小是。的实现方式，不同的厂商实现的方式不尽相同。的信息，也保存了这块内存的大小（16）。的时候怎么知道这块内存的大小的呢？的时候怎么知道这块内存的大小的呢？]]></description><category></category></item><item><title><![CDATA[C++面试八股文：什么是左值，什么是右值？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131255138</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131255138</guid><author>binarch</author><pubDate>Fri, 16 Jun 2023 23:48:59 +0800</pubDate><description><![CDATA[一次移动（当元素特别多时，移动的成本相对于拷贝基本可以忽略不记），一次析构。二师兄：移动构造是通过移动构造函数实现的，当类有资源需要管理时，拷贝构造会把资源复制一份，而移动构造偷走了原对象的资源。时，为了保证程序的正确性，编译器可能会采用拷贝构造的方式实现移动构造，从而导致效率降低。这里的确是通过static_cast实现的，讲左值强行转换成右值，用来匹配移动语义而非拷贝。是左值是和右值是匹配不同的实现，完成返回不同类型引用的目的。当传入的参数t的类型时右值时，由于引用折叠还是右值，此时的。]]></description><category></category></item><item><title><![CDATA[C++面试八股文：了解auto关键字吗？]]></title><link>https://blog.youkuaiyun.com/binarch/article/details/131237422</link><guid>https://blog.youkuaiyun.com/binarch/article/details/131237422</guid><author>binarch</author><pubDate>Thu, 15 Jun 2023 23:07:00 +0800</pubDate><description><![CDATA[这个特征可以避免变量未初始化就使用所导致的未定义的行为。第二点就是减少五吴意义的代码，如迭代器的类型、二师兄的表现不错，求各位小伙伴一个赞不过分吧。关键字是否存在都不影响程序正确性，所以很少有程序员在在C++98/03使用。C++标准委员会在C++11标准的制定中想到了被冷落的。关键字，并在C++11新标准中赋予了它新的能力。面试官：好的，今天的面试就到这里，回去等通知吧。大伙应该能看出来，在C++98/03中的。今日二师兄的表现很好，基本上回答出了。二师兄：嗯，了解一些（我很熟悉）。]]></description><category></category></item></channel></rss>