目录
对于缺页中断这种情况,linux操作系统是如何减少页面的换入换出的呢,有哪些方式?
对于https中的加密算法,rsa和ecc椭圆加密,这两者有什么区别么?
C++11 新特性了解哪些内容?
类型推导与简化语法
特性名称 | 描述 | 示例 |
---|---|---|
auto 关键字 |
自动推导变量类型,简化复杂类型声明(如迭代器)。 |
auto x = 42; → |
decltype |
推导表达式类型,保留 |
int i=1; decltype(i) j = i; → |
右值引用与移动语义
右值引用( |
区分左值/右值,支持资源高效转移(如临时对象)。 |
std::vector<int> v2 = std::move(v1); |
---|---|---|
移动构造函数/赋值运算符 |
减少深拷贝开销,通过资源转移提升性能。 |
类中定义 |
完美转发( |
保持参数原始类型,避免多次拷贝。 |
模板中使用 |
智能指针
std::unique_ptr |
独占所有权,不可复制但可移动,替代 |
std::unique_ptr<int> ptr = std::make_unique<int>(10); |
---|---|---|
std::shared_ptr |
共享所有权,引用计数管理资源,线程安全。 |
std::shared_ptr<int> ptr = std::make_shared<int>(10); |
std::weak_ptr |
解决 |
std::weak_ptr<int> w_ptr = s_ptr; |
函数与模板增强
Lambda 表达式 |
匿名函数,支持捕获外部变量,简化回调和算法。 |
std::sort(vec.begin(), vec.end(), [](int a, int b) { return a < b; }); |
---|---|---|
变长参数模板 |
支持任意数量/类型的模板参数,用于元编程和容器设计。 |
template<typename... Args> void func(Args... args); |
constexpr 常量表达式 |
编译时求值,优化性能,允许函数在编译期执行。 |
constexpr int factorial(int n) { return n <=1 ? 1 : n*factorial(n-1); } |
并发编程支持
std::thread |
原生多线程支持,结合互斥锁和原子操作实现同步。 |
std::thread t(func); t.join(); |
---|---|---|
std::async 和 |
简化异步任务管理,获取异步操作结果。 |
auto future = std::async(func); int result = future.get(); |
智能指针介绍一下?
-
std::shared_ptr:是一种引用计数智能指针,允许多个shared_ptr对象共享同一个对象,并通过引用计数来管理内存的释放,当最后一个shared_ptr指向对象析构时,会释放对象所占用的内存。不适合处理循环引用的情况,可能导致内存泄漏。
-
std::unique_ptr:是一种独占式智能指针,确保只有一个指针可以指向一个对象,不能进行复制,但可以移动它的所有权。
-
std::weak_ptr:是用于解决std::shared_ptr可能导致的循环引用问题的智能指针。它允许引用shared_ptr所管理的对象,但不会增加引用计数,不会影响对象的生命周期,避免循环引用导致的内存泄漏。
shared_ptr的作用是什么?
在传统的 C++ 编程中,使用 new
操作符分配的内存需要手动使用 delete
操作符释放,若忘记释放或者在异常情况下无法执行 delete
操作,就会造成内存泄漏。
std::shared_ptr
可以自动处理内存的释放,当不再有 std::shared_ptr
指向该对象时,对象的内存会被自动释放。
std::shared_ptr
支持多个 std::shared_ptr
实例共享同一个对象的所有权。它通过引用计数机制来实现这一点,每个 std::shared_ptr
都会维护一个引用计数,记录有多少个 std::shared_ptr
共享同一个对象。当引用计数变为 0 时,对象的内存会被释放。
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructor" << std::endl; }
~MyClass() { std::cout << "MyClass destructor" << std::endl; }
};
int main() {
std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
std::shared_ptr<MyClass> ptr2 = ptr1; // 共享所有权
std::cout << "Use count: " << ptr1.use_count() << std::endl; // 输出 2
ptr2.reset(); // 释放 ptr2 的所有权
std::cout << "Use count: " << ptr1.use_count() << std::endl; // 输出 1
// 当 ptr1 离开作用域时,MyClass 对象的内存会被释放
return0;
}
在这个例子中,ptr1
和 ptr2
共享同一个 MyClass
对象的所有权,引用计数变为 2。当调用 ptr2.reset()
时,ptr2
释放了对对象的所有权,引用计数减为 1。当 ptr1
离开作用域时,引用计数变为 0,对象的内存被释放。
weak_ptr的作用是什么?如何和shared_ptr结合使用?
std::weak_ptr
主要用于辅助 std::shared_ptr
进行内存管理,解决 std::shared_ptr
可能存在的循环引用问题,同时还可以用于观察 std::shared_ptr
所管理对象的生命周期。
当两个或多个 std::shared_ptr
相互引用形成循环时,会导致引用计数永远不会降为 0,从而造成内存泄漏。std::weak_ptr
不会增加所指向对象的引用计数,因此可以打破这种循环引用。
#include <iostream>
#include <mem