[C++] 零散知识点

来源:互联网 发布:linux中usermod 编辑:程序博客网 时间:2024/05/18 00:18
  • time_t实际上是长整型long int,它用来 保存从1970年1月1日0时0分0秒到现在时刻的秒数,用time()这个函数获取

  • gmtime

    • 函数原型:struct tm* gmtime(time_t* time)
    • 函数功能:得到以结构tm表示的时间信息
    • 函数返回:以结构tm表示的时间信息指针
    • 所述文件:<time.h>
    #include <stdio.h>#include <stdlib.h>#include <time.h>int main() {time_t t;struct tm* gmt;t = time(NULL);gmt = gmtime(&t);return 0;}
  • tm结构体

    struct tm {int tm_sec; // secondsint tm_min; // minutesint tm_hour; // hoursint tm_mday; // dayint tm_mon; // monthint tm_year; // year-1900int tm_wday; // day of week[0-6]int tm_yday; // days in year[0-365]int tm_isdst; // DST [-1/0/1]#ifdef __USE_BSDlong int tm_gmtoff; // seconds east of UTC__const char* tm_zone; // Timezone abbreviation#elselong int __tm_gmtoff; // seconds east of UTC__const char* __tm_zone; // Timezone abbreviation#endif};
  • timeval结构体

    struct timeval结构体在time.h中定义:

    struct timeval {time_t tv_sec; // secondssuseconds_t tv_usec; // Microseconds};

    其中,tv_sec为EPoch到创建struct timeval时的秒数,tv_usec为微秒数,即秒后面的零头,假如tv_sec为1244770435,tv_usec为442388,即当前时间距Epoch时间1244770435秒,442388微秒。

  • gettimeofday()

    获取当前时间(保存在结构体timeval中)

  • share_from_this

    当类对象被shared_ptr管理时,需要在类自己定义的函数里把当前对象作为参数传给其他函数时,这时需要传递一个shared_ptr,否则就不能保持shared_ptr管理这个类对象的语义(因为一个raw poiter指向这个类对象,而shared_ptr对类对象的这个引用没有计数,很可能shared_ptr已经把类对象资源释放了,而那个调用函数还在使用类对象)。

    对一个类 A ,当我们希望使用 shared_ptr 来管理其类对象时,而且需要在自己定义的函数里把类对象 shared_ptr (为什么不用普通指针,当我们使用智能指针管理资源时,必须统一使用智能指针,而不能在某些地方使用智能指针某些地方使用 raw pointer ,否则不能保持智能指针的语义,从而产生各种错误)传给其他函数时,可以让类 A 从 enable_shared_from_this 继承: 

    class A : public boost::enable_shared_from_this<A> {};

    然后在类A中需要传递类对象本身shared_ptr的地方使用shared_from_this函数获得指向自身的shared_ptr。

  • boost::shared_from_this值得注意的地方

    这个 函数仅在shared_ptr<T>的构造函数被调用之后才能使用,原因是enable_shared_from_this::weak_ptr并不在enable_shared_from_this<T>构造函数中设置,而是在shared_ptr<T>的构造函数中进行设置。

    • 如下代码是错误的
    class D : public boost::enable_shared_from_this<D> {public:  D() {    boost::shared_ptr<D> p = shared_from_this();  }};

    在D的构造函数中虽然可以保证enable_shared_from_this<D>的构造函数已经被调用,但是weak_ptr还没有设置。

    • 如下代码是错误的
    class D : public boost::enable_shared_from_this<D> {public:  void func() {    boost::shared_ptr<D> = shared_from_this();  }};void main() {  D d;  d.func();}

    错误原因同上。

    • 如下代码是正确的
    void main() {  boost::shared_ptr<D> d(new D);  d->func();}

    这里boost::shared_ptr<D> d(new D)实际上执行了3个动作:

    • 首先调用enable_shared_from_this<D>的构造函数;
    • 其次调用D的构造函数;
    • 最后调用shared_ptr<D>的构造函数。

    是第3个动作设置了enable_shared_from_this<D>的weak_ptr,而不是第1个动作。

  • shared_from_this使用场景

    需求:在类的内部需要自身的shared_ptr而不是this裸指针

    场景:在类中发起一个异步操作,callback回来要保证发起操作的对象仍然有效

    异步回调的时候对象可能已经销毁了,所以使用shared_ptr传出去就是保证最少还有一个引用计数维持对象的生命周期直至回调结束。

  • __thread

    __thread是GCC内置的线程局部存储设施,存储效率可以和全局变量相比,__thread变量每一个线程有一份独立实体,各个线程的值互不干扰

  • getpid、SYS_gettid以及pthread_self

    getpid()得到的是进程的pid,在进程中,每个线程都有自己的pid,要得到线程的pid,必须用syscall(SYS_gettid),其在系统内是唯一的,pthread_self函数获取的是线程ID,线程ID在某进程中是唯一的,在不同的进程中创建的线程可能会出现ID值相同的情况。