Ref: https://www.tangramvision.com/blog/c-rust-generics-and-specialization
泛型入门:输入的类型
C++和 Rust 中的泛型都是一种将其他类型作为其定义的一部分的类型。泛型是通过在类型定义中指定占位符的一种方式,然后可以 使用更具体的类型来替换,例如在 C++中可以这定义一个泛型类型:
template<typename T>
struct MyArray {
T* raw_array;
std::size_t size;
};
对于这个泛型结构而言,MyArray<int>...
Ref: https://www.tangramvision.com/blog/c-rust-interior-mutability-moving-and-ownership
C++和 Rust 中的不变性(constness)
值
Rust 和 C++有两个非常相似的概念,即 Rust 中的 mutability/immutability 和 C++中的 constness/non-constness. 在 Rust 中,一个给定的值要么是可变的(mutable),要么是不可变的(immutable),正如这些限定符名称所代表的含义,可变的值可以被修改,不可变的值不能被修改。 然而与 C++不同的是,Rust 中不可变的值...
在C/C++中,我们经常会像下面的代码那样使用一个指向函数的指针,我们称之为函数指针:
// demo.c
#include <stdio.h>
int func(int a) {
return a + 1;
}
int main(int argc, char* argv[]) {
int (*f)(int) = func;
printf("%p\n", f);
return 0;
}
上面的例子中,我们定义了一个函数func
,然后通过函数指针f
指向func
,接着使用print
函数打印指针变量f
指向
的地址。代码平淡无奇,接着我们编译代码,然后使用objdump -D...
std::list splice 简介
splice
函数通过重新排列链表指针,将一个std::list
中的节点转移到另一个std::list
中。在元素的转移过程中不会触发元素的拷贝或者移动。因此,调用splice
函数之后,元素现有的引用和迭代器都不会失效。
下面是一个将listA
中所有节点附加到listB
的一个简单代码示例,转移的过程不会导致listA
中元素的引用和迭代器失效:
// Note: c++17 required below. (For CTAD(Class template argument deducation))
std::list listA{1, 2, 3};
std::list listB{4, 5, 6...
关于 shared_ptr
shared_ptr
是一种共享所有权的智能指针,它允许我们安全地访问和管理对象的生命周期。shared_ptr
的多个实例通过共享控制块结构来控制对象的生命周期。
控制块维护了引用计数(reference count),弱引用计数(weak count)和其他必要的信息,通过这些信息,控制块能够确定一个对象在内存中是否可以被安全销毁。
当使用原始指针构造或者初始化一个shared_ptr
时,将会创建一个新的控制块。为了确保一个对象仅由一个共享的控制块管理,必须通过复制已存在的shared_ptr
对象来创建一个新的shared_ptr
实例,例如:
void good()
{
auto p{new int...
前言
c++11 对智能指针做了很大的优化,废弃了 c++98 中的auto_ptr
,引入了三种新的智能指针:unique_ptr
,shared_ptr
,weak_ptr
。
本文将针对unique_ptr
的一些使用技巧做一些整理和归纳。在正式开始之前,我们首先来回顾一下unique_ptr
的特点:一个unique_ptr
对象内包含一个原始指针,该unique_ptr
对象负责管理原始指针的生命周期。
一个unique_ptr
对象始终是其关联的原始指针的唯一拥有者。
在了解了unique_ptr
的特点之后,我们来具体看看日常开发中unique_ptr
的一些使用场景和技巧。
一些场景
本地对象指针
在开发中,我们经常会遇到或者写出类...
constexpr 是 c++11 引入的关键字,用于编译时常量和常量表达式。而 c++17 将这一特性做了增强,引入了 constexpr if
,
使得编译器在编译时(compile time)能够做分支判断,从而有条件的编译代码。
下面可以通过一个简单的例子来看看constexpr if
的用法:
#include <iostream>
#include <type_traits>
template<typename T> auto getValue(T t)
{
if constexpr (std::is_pointer<T>::value) {...