2022-12 水木羽林笔面试

  1. 资源管理 (1) C++的RAII机制是什么概念。 用于垃圾回收的机制,声明一个对象时调用其构造函数,退出一个对象的作用域时调用其析构函数,在析构函数里释放对象内部动态申请的内存,避免内存泄漏。

(2) 在std::中列出几个典型的使用了RAII机制的类。unique_ptr, shared_ptr, vector

  1. 内存管理 (1) C++程序启动后一般有哪些内存区域? 从低地址到高地址依次是代码段、初始化的数据段、未初始化的数据段、堆、栈。

(2) 在这些区域中的对象,各自的生命周期是什么样?前三个区域的生命周期贯穿于程序整个运行期间,堆上的对象可由程序员指定什么时候结束其生命周期,栈上的对象在退出其作用域时会调用其析构函数结束其生命周期。

(3) 智能指针是如何管理内存的,和Java等语言的垃圾回收对比,优势和劣势有什么?unique_ptr 会把其拷贝构造函数、移动构造函数设为私有的或者删除的,从而使得外部无法共享其指向的数据;shared_ptr通过引用计数实现多个指针对同一块内存数据的共享,记录当前有多少个指针共享这块内存,只有当计数器为0了才会真正释放数据;weak_ptr 不影响引用计数,在获取数据时通过尝试转换为shared_ptr再获取数据。和Java相比,优势是程序员可以主动管理内存,根据需要及时确定哪块内存需要被回收,按什么顺序回收内存,劣势是增加了程序中产生内存泄漏、数组越界和core dump的风险。

  1. STL (1) STL的Iterator是什么概念? 是一种按迭代器设计模式设计的用于有序访问容器元素的功能。

(2) 和其他语言常见的,基于继承的迭代器相比,C++基于模板的有什么优势和劣势?优势是增加了程序的可扩展性、通用性,代码的简洁性,劣势是需要include模板所在的整个头文件的代码,增加了不需要的逻辑,可能导致编译时间较长,代码的易读性不好,也不方便调试。

(3) for (Item : Collection) 循环原理是什么?如果想要自定义的类支持,需要怎么做?原理是调用Collection的迭代器来遍历处理它的每一个元素;对于自定义类,需实现iterator begin() 、iterator end() 、void operator++()、const T& operator*()、bool operator!=() 函数,通过begin获取指向第一个元素的迭代器,通过++指向下一个元素,通过*来对迭代器解引用,拿到它指向的元素,最后通过重载!=来判断是否处理到了end指向的位置,如果是就停止循环。

  1. 自己实现一个std::optional类,只需要实现核心功能即可。
template <typename T>
class Optional
{
private:
    bool isNotNull;
    T data;

public:
    Optional() : isNotNull(false) {}

    Optional(const T &v)
    {
        data = v;
        isNotNull = true;
    }

    Optional(const Optional &v)
    {
        if (v.hasValue())
        {
            data = v.data;
            isNotNull = true;
        }
        else
        {
            isNotNull = false;
        }
    }

    ~Optional()
    {
        ((T *)&data)->~T();
    }

    bool hasValue() const { return isNotNull; }

    T &value()
    {
        return data;
    }

    T &operator*()
    {
        if (isNotNull)
            return data;
        else
            throw std::runtime_error("This optional has no value.");
    }

    operator bool() const
    {
        return isNotNull;
    }

    Optional &operator=(const Optional &v)
    {
        if (v.hasValue())
        {
            data = v.data;
            isNotNull = true;
        }
        else
        {
            isNotNull = false;
        }
        return *this;
    }

    bool operator==(const Optional<T> &v) const
    {
        if (isNotNull != v.hasValue())
            return false;
        else if (isNotNull)
            return data == v.data;
        else
            return true;
    }
};

### 2022-12-29-面试-32min

右值引用的场景举例

返回值加move

这个不算,编译器早就知道怎么做返回值优化了

for(auto&&

和左值引用有啥区别

移动拷贝和移动构造的使用场景

目标文件.o是啥格式的

Optional 类的析构函数怎么理解?

无参构造函数里怎么避免调用数据成员data的T()构造函数?

T如果是个int*怎么析构?指针不一定指向堆上的内存。

https://blog.csdn.net/chenlong_cxy/article/details/126747523

最后有避免调用T构造函数的例子

有人用chatgpt也找到了解,只是不是很完善

#实习##C++##面试##笔试#
全部评论

相关推荐

06-26 10:08
门头沟学院 C++
北京Golang实习,一个月4700,吃住都不报,公司位置在海淀。请问友友怎么看呢?如果要租房的话有什么建议吗
码农索隆:租房肯定是合租了,剩下的钱,差不多够正常吃饭了,看看能不能学到东西吧
点赞 评论 收藏
分享
07-11 17:51
已编辑
河北大学 Java
首先就是做一下自我介绍1.你的项目自己一个人做,是怎么部署的,是阿里云还是什么(麻了没部署过)2.那如果是分布式场景,网页如果加载过慢,你怎么排查是哪个方面问题(当时听到就蒙了,就答了个sql调优)后来又问,你怎么知道一定是sql原因,怎么看是不是其他原因(没答出来)3.你刚刚提到sql,那mysql查询语句一个流程。4.优化器怎么优化的(没了解,就说了个联合索引)5.我们的sql其实也是一个字符串,那他到底是怎么执行的(问题没记清楚,人已经麻了,完全没想到过)6.redis有缓存,如果我数据库缓存足够大,是不是不需要redis了(之前说了个缓存怎么判断,所以我又扯那个上面了,他说好像也是)7.说说缓存穿透和缓存雪崩怎么解决(刚说完缓存穿透就问下面的了)8.你自己该怎么实现布隆过滤器(太复杂,没实现过,直接说不会了)9.说说url到显示的一个过程(扯远了,扯到spring&nbsp;mvc&nbsp;被叫停了)10.不需要说mvc,那你说说dns和tcp的过程(猪脑过载,不会dns,tcp因为想dns,直接说不会了,回来一想完了)11.我看看,嗷没有说对并发了解,对集合了解对吧,说说常见集合类12.你怎么自己实现一个hashmap(脑子直接炸了,我说像源码用数组加链表和红黑树可以吗)他说为什么一定要用链表(我说插入和查询复杂度低)又追问不用行不行(不会了)13.你对spring&nbsp;aop了解,那你说说,我们只用spring提供的代码,怎么自己实现一个迷你的aop(没反应过来,现在想想,是在问动态代理吗,反正这时候已经宕机了)14.之前还问了,索引的底层实现,忘记写了15.也是之前的,你对io流有过了解,怎么通过自带的什么代码库什么什么,这个真记不清楚了,实现一个东西,忘了,已经对这些底层怕了16.平时遇到问题怎么解决,能理解英文文档吗(csdn,没怎么看过文档)17.之前的,怎么实现线程池反问环节:1.公司做大数据,招java主要的业务是什么用来做中控2.第一次面试,给点建议总结就是多看408估计是凉了~
程序员小白条:部署直接宝塔+一个服务器咯,阿里,腾讯随便搞,或者你 Docker 也行,网页加载慢,从OSI七层去看咯,sql直接到后端了,肯定不是啊,至少也得有前端吧,还有网关gateway,nginx,还有各种cdn等问题,自己老老实实背八股吧,很多都很基础的
查看22道真题和解析
点赞 评论 收藏
分享
评论
2
25
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务