WeiNote

yyrcd

cpp

2021

Sep 11

2021-09-11 ·

i++ vs ++i

  • ++i will increment the value of i, and then return the incremented value.
  • i++ will increment the value of i, but return the original value that i held before being incremented.
  • In any case, follow the guideline "prefer ++i over i++" and you won't go wrong.
  • i++ could potentially be slower than ++i, since the old value of i might need to be saved for later use, but in practice all modern compilers will optimize this away.

Ref: What is the difference between ++i and i++?Similarly

2021

Aug 28

2021-08-28 ·

Map

unordered_map vs map

map:

  • elements 在内部是排序的(升序)
  • Search (Insert Delete) in O(log n)
  • implemented with Self balancing BST (Binary Search Tree)

unordered_map:

  • 无序的
  • Search (Insert Delete) in O(1)
  • implemented with Hash Table

Ref: map vs unordered_map in C++ - GeeksforGeeks

emplace vs insert vs operator[]

emplace is efficient when inserting non-primitive object since it avoids copying.

std::unordered_map::operator[]
Returns a reference to the value that is mapped to a key equivalent to key
performing an insertion if such key does not already exist.

Ref: c++11 - What is the difference between unordered_map::emplace and unordered_map::insert in C++? - Stack Overflow

2021

Aug 27

2021-08-27 ·

const 那些事

Ref: 2021-08-22-const那些事 - C++那些事.pdf

作用:

  • 防止修改
  • const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。

extern:

  • 非const变量默认为extern。要使const变量能够在其他文件中访问,必须在文件中显式地 指定它为extern。

指针:

const char * a; //指向const对象的指针或者说指向常量的指针。
char const * a; //同上
char * const a; //指向类型对象的const指针。或者说常指针、const指针。
const char * const a; //指向const对象的const指针。

小结:

  • 如果const位于 * 的左侧,则const就是用 来修饰指针所指向的变量,即指针指向为常量;
  • 如果const位于 * 的右侧,const就是修饰指针本身,即指针本身是常量。

函数中使用const

const修饰函数参数:

  1. 防止参数指针修改参数
    void StringCopy(char *dst, const char *src);
  2. 参数为引用,为了避免拷贝同时防止修改。
    void func(const A &a)
  • 对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是避免拷贝。例如将void func(A a) 改为void func(const A &a)
  • 对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void func(int x) 不应该改为void func(const int &x)

2021

Aug 25

2021-08-25 ·

#include

#include <filename>  # normally for standard library headers
#include "filename"   # for user-defined headers

Ref: c++ - What is the difference between #include and #include "filename"? - Stack Overflow

2021

Aug 19

2021-08-19 ·

void** 的使用

cudaError_t cudaMalloc(void** devPtr, size_t size)

common usage:

void* mem;
cudaMalloc(&mem, num_int_bytes);
int* array = mem;

void* is a pointer to something. But cudaMalloc() needs to modify the given pointer (the pointer itself not what the pointer points to), so you need to pass void** which is a pointer to the pointer (usually a pointer to the local variable that points to the memory address) such that cudaMalloc() can modify the value of the pointer.

2021

Jun 14

2021-06-14 ·

二维数组指针

#include <iostream>

int main(){
    int a[3][4];
    for(int i = 0; i<3; i++){
        for(int j = 0; j<4; j++){
            a[i][j] = j;
        }
    }
    int (*p)[4];
    p = a;
    std::cout<< "p[0] = " << p[0] << std::endl;
    std::cout<< "p[0][0] = " << p[0][0] << std::endl;
}

Run at https://godbolt.org/z/TrPPjx1vv int (*p)[4];int *p[4]; 的区别:int *p[4]; 是个存了 4 个 int* 的数组,而int (*p)[4]; 是个 二维数组的指针。 int * 可以理解为

typedef int* intpointer;
intpointer p[4]  // 就是个一维数组

2021

May 13

2021-05-13 ·

Explicit Template Instantiation

template float twice<float>(float original);

Ref: 6.3 Template Instantiation (Sun Studio 12: C++ User's Guide)

2020

2020

Nov 29

2020-11-29 ·

指针 和 引用

指针和引用的相同点和不同点:

相同点:

  • 都是地址的概念;
  • 指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。

不同点:

  • 指针是一个实体,而引用仅是个别名;
  • 引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
  • 引用没有 const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有 的, 前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)
  • 引用不能为空,指针可以为空;
  • sizeof 引用得到的是所指向的变量(对象)的大小,而sizeof 指针得到的是指针本身的大小;
  • 指针和引用的自增(++)运算意义不一样;
  • 引用是类型安全的,而指针不是 (引用比指针多了类型检查)

Ref: 传值,传指针和传引用区别和联系_走过_冬天的博客-CSDN博客_传值和传引用的区别

使用