zoukankan      html  css  js  c++  java
  • C++ 笔记

    1. error: ‘for’ loop initial declarations are only allowed in C99 mode

    这是因为gcc基于c89标准,换成C99标准就可以在for循环内定义i变量了:

    gcc src.c -std=c99 -o src

    2. cpp引用.c文件 ,需要给.c文件编写个头文件才可以

    3. relocation R_X86_64_PC32 against undefined symbol `DecodeSimpleBitmap(decoder_t*, unsigned char const*, int)' can not be used when making a shared object; recompile with -fPIC

    去掉 头文件和c文件 函数前面的static即可

    4.

    查看动态库中的函数  

    nm -D libsubtitle_service.so

    查看静态库/动态库中的函数

    linux

    nm -g --defined-only xx.a

    nm -D xx.so

    windows

    dumpbin /exports libxxx.a

     

    查看.a文件中的.o

    ar -v -t ./libtensorflow-core.a

     

    nm 命令详解 http://www.360doc.com/content/13/0526/17/532901_288335598.shtml

    https://baike.baidu.com/item/nm/4592092?fr=aladdin


     

    5. 编译程序遇到问题  relocation R_X86_64_32 against `.rodata' can not be used when making a shared object;


    发现编译的程序引用的一个库(.a文件)是直接用./configure 编译的, 64位机器不能直接./configure 进行配置,需要采用如下方式


    CFLAGS="-O3 -fPIC" ./configure

    make

    make install


    6. libopencv_core.a(persistence.cpp.o): In function `icvGets(CvFileStorage*, char*, int)':

    静态库少东西,加上-lz -ldl 即可


    7. 包含静态库的时候,顶层lib先链接,底层lib后链接


    8. 出现undefined sample 的一个原因 , make clean 未完全清楚之前的.o文件,修改makefile即可


    9. char*指针malloc后,不要给其赋指针,要用strcpy的方法拷贝数据。 不然会出现内存泄露,free该指针出现崩溃


    10 。pthread_mutex_t  一定要初始化和释放,不然出了问题都不知道是哪里出了我勒个去。。。。pthread_mutex_init

    11. 头文件: 

    stdlib.h:     malloc

    12  常见数据结构字节数

    WIN32 
    unsigned short : 2
    long           : 4
    unsigned long  : 4
    unsigned char  : 1
    char           : 1
    unsigned int   : 4
    short          : 2
    LINUX_64 
    unsigned short : 2
    long           : 8
    unsigned long  : 8
    unsigned char  : 1
    char           : 1
    unsigned int   : 4
    short          : 2

    13   GDB调试命令

    1. 添加断点

     

    某行添加断点  b 2

     

    某函数添加断点  b functionName

     

    2. 单步调试 s

     

    3 . 运行 r

     

    4. 查看变量值

     

    查看局部变量  info locals

     

    打印数组值  p a

     

    5. 指定文件断点    b filepath:line_number

     

    6. 删除所有断点  clear

      删除第几个断点  delete 1

     

    7 继续运行   c

     

    14. Makfile

    生成可执行文件    g++ mutiprocess.cpp -o test

    链接生成静态库    ar crv libmyAPI.a myAPI.o

     

    -fpic:产生位置无关码,位置无关码就是可以在进程的任意内存位置执行的目标码,动态链接库必须使用

    -c : 只生成 .o 文件

    -o : 生成可执行文件

    -g : 生成可调试文件

     -lworld        表示libworld.so动态库文件

    -L   指定库目录

    “-static”表示寻找libworld.a静态库文件

    -shared   生成动态库

    -s : 在命令运行时不输出命令的输出

    .so makefile 

    -Wl      选项告诉编译器将后面的参数传递给链接器。

    -soname      则指定了动态库的soname(简单共享名,Short for shared object name)

    -rpath <dir>  将一个目录强行指定为.so的搜索目录

    include foo.make *.mk $(bar)   包含文件

    -Wl,-rpath,/usr/local/lib   指定运行时库目录

     

    15  类、模板

    1. 带参数构造函数初始化

     

    2,  模板函数的特化

     16 VS 相关

    16.1 目录

    $(TargetName) :项目名

    $(TargetExt):生成目标后缀,比如".exe"

    $(Platform)     Win32 或 X64

     $(SolutionDir)

    $(Configuration)  Debug 或 Release

    $(ProjectName)_d     目标文件名填这个,则生成的xxx_d.lib xxx_d.dll 

      16.2  VS win32程序升级为X64

           ---->然后点开全部设置为X64

    然后点击项目-->属性-->链接器-->高级-->目标主机 改为X64

    16.3 禁用大括号自动补全

    选项--文本编辑器--C/C++ -- 常规--   自动大括号完成

    16.4  VS 插件  indent guides   : 给代码加虚线

    16.5  dll 路径加入环境变量 然后重启VS就行了

    16.6 注释与解注释快捷键

    注释   ctrl + K + C     解注释 ctrl+K +U

    16.7  无法加断点

      选项--调试---启用 “使用托管兼容模式”  + "使用本机兼容模式"    成功!!!

    16.8 Debug模式无法查看局部变量的值

      项目--属性--C/C++ -- 优化 -- 禁用/od

    16.9   当前不会命中断点 还没有为该文档加载任何符号

          项目-〉属性-〉配置属性-〉链接器-〉调试-〉优化以便于调试。

    16.10 debug 的exe 或者dll  后面跟“_d”

    常规 -- 目标文件名 --$(ProjectName)_d

     

    18  ldd 可以发现so依赖的动态库

    ldd libpic_detection_service.so

    19 不要给int []数组 用memset赋值 , memset 只能给uchar char 赋值 。。 memset 对于int 只能用来清零。

    20 regex  C++11 匹配   需要加 -std=c++11

    
    

    vector<string> search_string(const string& in, const string &pattern_t)
    {

    const regex pattern(pattern_t);
    std::sregex_token_iterator p(in.begin(), in.end(), pattern);
    std::sregex_token_iterator end;
    std::vector<std::string> vec;
    while (p != end)
    vec.push_back(*p++);

    return vec;
    }

     21  C语言中求 sin cos asin  都是弧度制

    22.  C++ 中的 extern  static  const     

    23. extern "C"  用法

      未加extern "C"声明时的连接方式
      假设在C++中,模块A的头文件如下:
    // 模块A头文件 moduleA.h
    #ifndef MODULE_A_H
    #define MODULE_A_H
    int foo( int x, int y );
    #endif
      在模块B中引用该函数:
    // 模块B实现文件 moduleB.cpp
    #include "moduleA.h"
    foo(2,3);
      实际上,在连接阶段,连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号!
      加extern "C"声明后的编译和连接方式
      加extern "C"声明后,模块A的头文件变为:
    // 模块A头文件 moduleA.h
    #ifndef MODULE_A_H
    #define MODULE_A_H
    extern "C" int foo( int x, int y );
    #endif
      在模块B的实现文件中仍然调用foo( 2,3 ),其结果是:
      (1)模块A编译生成foo的目标代码时,没有对其名字进行特殊处理,采用了C语言的方式;
      (2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名_foo。
      如果在模块A中函数声明了foo为extern "C"类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。
     
    24  CUDA 
    24.1 编译出现错误 : ptxas fatal : Unresolved extern function xxxx    

    第一是两个函数放到同一个cu文件中。

    第二是在cu文件属性页面选项卡中 cuda c/c++->common->Generate Relocatable Device Code 选择-rdc=true。允许重定位device代码编译。或者在整个工程的cuda c/c++项中配置这个-rdc=true.

     25   static

    静态函数只能是本源文件内可见,其他源文件可以定义同名函数
    不加static的函数,可以被其他源文件中的函数进行调用 ,若定义同名函数会报错(或出现函数重载)

    26 SSE 指令集

    addps:对128位寄存器的每32位做浮点加法运算。

    subps:对128位寄存器的没32位做浮点减法运算。

    mulps:对128位寄存器的每32位做浮点乘法运算,并且不考虑乘法可能形成的进位。

    divps:对128位寄存器的每32位做浮点除法运算。

    paddd:对128位寄存器的每32位做整形加法运算。不过我在做YUV与RGB互转的指令优化中用到更多的是paddw,该指令是对128位寄存器的每16位做加法运算,在保证不出现进位的情况下,paddw指令比paddd一次能处理更多字节的数据。

    psubd:对128位寄存器的每32位做整形减法运算。当然也有psubw可以处理16位整形减法。

    pmulld:对128位寄存器的每32位做整形乘法运算,形成一个64位的立即数,然后取立即数的低32位到目的寄存器的对应bit位中。诸如此类的pmullw,是对128位寄存器的每16位做整形乘法运算,形成一个32位立即数,然后取立即数的低16位到目的寄存器的对应bit位中。

    float af[4] = {5.0f, 6.0f, 7.0f, 8.0f};
    float bf[4] = {5.0f, 6.0f, 7.0f, 8.0f};
    float add[4], sub[4], mul[4], div[4];
    __asm
    {
           movups xmm0,  af;
           movups xmm1,  bf;
           movups xmm2,  xmm0;
           // 加法
           addps  xmm0,  xmm1;
           movups add,   xmm0;
           // 减法
           movups  xmm0, xmm2;
           subps   xmm0, xmm1;
           movups  sub,  xmm0;
           // 乘法
           movups  xmm0, xmm2;
           mulps   xmm0, xmm1;
           movups  mul,  xmm0;
           // 除法  
           movups   xmm0,  xmm2;
           divps    xmm0,  xmm1;
           movups   div,   xmm0; 
    }
    // 上面用到的四则运算指令都是浮点运算指令
    int ai[4] = {4, 5,  6, 7};
    int bi[4] = {4,56, 7};
    int add[4], sub[4], mul[4], div[4];
    __asm
    {
          movupd xmm0, ai;
          movupd xmm1, bi;
          movupd xmm2, xmm0;
         
          // 加法
          paddd   xmm0,  xmm1;
          movupd  add,   xmm0;
    
          // 减法
          movupd  xmm0,  xmm2;
          psubd   xmm0,  xmm1;
          movupd  sub,   xmm0;
        
          // 乘法
          movupd   xmm0,  xmm2;
          pmulld   xmm0,  xmm1;
          movupd   mul,   xmm0;
    
          //  除法
          movupd   xmm0,  xmm2;
          divps    xmm0,  xmm1;
          movupd   div,   xmm0;
    }

     27   使用OPENCV静态库,  运行程序时出现错误  undefined symbol: _ZN2cv12_OutputArrayC1ERNS_3MatE      

           1 交换库的包含顺序   -----仍然出现

           2 加入Xlinker 仍然出现

            3. 加入 rm -f $(FILE)/picture/cv_picture.o  成功,  发现是因为旧的.o 文件没有清除的原因,麻蛋。 

     28   opencv 需要包含的库

    opencv244 : opencv_core244d.lib   opencv_highgui244d.lib  opencv_imgproc244d.lib

    29  Win32

    29.1

    Win32控制台程序中使用CString 

    <afxwin.h>  #include<afx.h>   在<windows.h> 之前包含

    29.2   解决 nafxcw.lib   和  libcmt.lib 库冲突问题      附加依赖项里输入nafxcw.lib 即可

    29.3 一个最简单的win32 程序   https://zhidao.baidu.com/question/589941830.html

     

     

     

    30 . new 一个int 数组失败,报堆损坏的错误-------代码其它地方有内存泄露!!!

     

     

    32 无法解析的外部符号

    32.1 . 

    问题:无法解析的外部符号__imp__wassert          默认库“msvcrtd.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

    解决方法 :工程中有库用了MD编译,重新用MT编译就行了

    法2 : (不建议用,用了后程序性能下降)右击工程 - 属性 ”配置属性 - 链接器 - 命令行” 添加:  /NODEFAULTLIB:"libcmt.lib"   

     

     

    33. VS只生成dll 不生成 lib  :  预定义里加上  SOUI_EXPORTS ,

    如果仍然未解决 查看.cpp  是否点击了“不参与生成”

    34  makefile 中  :=    https://blog.csdn.net/fdsafwagdagadg6576/article/details/46680927

    36  解决dll 链接不一致

    VS宏定义加入 AOS_EXPORTS  即dll的生成宏就行了

    37  0X150002  解决办法

    计算机-管理-windows日志-查看错误原因-  发现libcurl 加载失败

    然后使用阿里云里面的curl.dll 就好了。

    38 core文件分析

          1. core文件生成打开方式: 

    ulimit -c unlimited

    echo "1" > /proc/sys/kernel/core_uses_pid

    看下服务器上是否安装了 gdb,没有的话要装一下

    以调试模式打开程序 ./sip_gw -t2 -n 1

    之后程序会crashed, 程序目录或者根目录 会生成一个core文件 

          2. core 文件分析

    查看core文件 :

    gdb transcoder core.64488 然后输入bt

         3. 关闭 core   ulimit -c  0

    ulimit -c 0 不产生core文件
    ulimit -c 100
     设置core文件最大为100k

    ulimit -c unlimited 不限制core文件大小

     

     39   函数指针做形参

    40  迭代器用法

        for (std::vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
            *iter = 0;

     41   sizeof

    class A{
           char a;
           double b;
           int c;
    };
    //a、b、c的长度分别为1、8、4,以最长的8为界分为三组:a为一组,取8大于1的最小倍数,为8。
    //第二部分只有b,大小为8B。第三部分只有c,取8大于4的最小倍数,即为8。sizeof(A)=8+8+8=24B。
    class B{
           char a;
           int b;
           double c;
    };
    //a、b、c的长度分别为1、4、8,以最长的8为界分为两组,a、b为一组,和为5,取8大于5的最小倍数,为8。
    //第二部分只有c,所以sizeof(B)=8+8=16B。




    42 VS远程调试linux程序
    https://blog.csdn.net/endurehero/article/details/81206398
    https://blog.csdn.net/yitang2003/article/details/77196721
    可能遇到的问题:undefined symbol 解决方法

    4
    3 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 "public: void __thiscall XX
    在vs2010项目设置中【Linker】-【input】-【additional dependencies】追击nafxcw.lib,libcmt.lib,Debug下,追加Nafxcwd.lib,libcmtd.lib。



    44
    windows 判断是否是64位程序 _WIN64
    linux






    46 使用 opencv 库出现bug undefined reference to `Imf_2_2::globalThreadCount()'
    原因: IlmImf库是C++0x编译的, 但是你的程序使用的参数是std=c++11
    解决方法 参数设置为std=c++0x



    48 静态库和动态库链接
    static lib -L path -llib -static
    dynanic lib : -L path -llib

    49 复制构造函数 和 赋值函数的区别
    https://www.cnblogs.com/kaituorensheng/p/3245522.html


    50 uint64 在数据中的存储结构

    51 xml 的读取与生成

    读取: https://blog.csdn.net/qingzai_/article/details/44982725

    生成: https://blog.csdn.net/u012104827/article/details/81109000

    52  Makefile  加入其它Makefile

    include Vector3D/makefile
    include Color/makefile


    53 CMAKE

    Cmakelist  详解 https://www.cnblogs.com/cv-pr/p/6206921.html

    cmake 参数    BUILD_SHARED_LIBS:指定编译成静态库还是动态库;

    https://blog.csdn.net/fengbingchun/article/details/46685413

    CMAKE  设置安装目录
    CMAKE_INSTALL_PREFIX

    1. add_library

    该指令的主要作用就是将指定的源文件生成链接文件,然后添加到工程中去。该指令常用的语法如下:

    add_library(${EXECUTABLE_NAME} SHARED  ${SOURCE_FILES})

    2. link_directories

    该指令的作用主要是指定要链接的库文件的路径,target_link_libraries(${EXECUTABLE_NAME} ${OpenCV_LIBS})

    3. target_link_libraries

    该指令的作用为将目标文件与库文件进行链接。










    安装opencv静态库
    wget https://github.com/opencv/opencv/archive/3.4.0.tar.gz
    cmake ../ -DCMAKE_INSTALL_PREFIX=install -DBUILD_SHARED_LIBS=false -DBUILD_PERF_TESTS=false -DBUILD_TESTS=false

    ###-DWITH_OPENEXR=OFF 
    一些错误解决办法:
    opencv-3.3.0/modules/videoio/src/cap_ffmpeg_impl.hpp
    文件最开始加入以下三行
    #define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
    #define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
    #define AVFMT_RAWPICTURE 0x0020

    55 pkgconfig

    gcc -g arrow.c -o arrow  `pkg-config "gtk+-2.0 > 2.0.0" --cflags --libs`

     g++  'pkg-config --cflags --libs "/work/lib/opencv/3.3.0" '

    56  链接opencv库出现错误   undefined reference to symbol 'pthread_mutexattr_settype@@GLIBC_2.2.5'

    说明opencv库是用2.2.5的Glib编译的, 我们需要使用更低内核的opencv库

    解决方法是使用更低版本glibc编译的opencv

    57  ubuntu14安装 G++-5

    sudo apt-get install g++-5

    58 添加库路径
    /etc/ld.so.conf
    /sbin/ldconfig


    58 vs2019 编译linux C++
    https://blog.csdn.net/ZYZMZM_/article/details/89044885

     59  vector 排序

    #include<iostream>
    #include<vector>
    #include<set>
    #include<string>
    #include<algorithm>
    using namespace std;
    struct student{
        char name[10];
        int score;
    };
    //自定义“小于”
    bool comp(const student &a, const student &b){
        return a.score < b.score;
    }
    int main(){
        vector<student> vectorStudents;
        int n = 5;
        while (n--){
            student oneStudent;
            string name;
            int score;
            cin >> name >> score;
            strcpy(oneStudent.name, name.c_str());
            oneStudent.score = score;
            vectorStudents.push_back(oneStudent);
        }
        cout << "===========排序前================" << endl;
        for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){
            cout << "name: " << it->name << " score: " << it->score << endl;
        }
        sort(vectorStudents.begin(),vectorStudents.end(),comp);
        cout << "===========排序后================" << endl;
        for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){
            cout << "name: " << it->name << " score: " << it->score << endl;
        }
        return 0;
    }

     60  libyuv  

    libyuv::RGB24ToI420(src.data, 3 * src.cols, yuv.data[0], yuv.stride[0], yuv.data[1], yuv.stride[1], yuv.data[2], yuv.stride[2], w, h);

     61  map

    #include <map>
    #include <iostream>
    #include <vector>
    #include<algorithm>//因为用了sort()函数  
    #include<functional>//因为用了greater<int>() 
    using namespace std;
    typedef map<int, double>::iterator Miter;
    int main()
    {
        vector<double > ds;
        ds.resize(4);
        ds[0] = 1;
        ds[1] = 0.2;
        ds[2] = 5;
        ds[3] = 3;
        map<int, double,greater<int>> ens;
        for (int i = 0; i != ds.size(); ++i) {
            ens.insert(map<int, double> ::value_type(i*(-1), ds[i]));
        }
        ////查找key为0 的元素
        Miter _it = ens.find(-1);
        cout << _it->first << " " << _it->second << endl;//遍历map
        int i = 0;
        for (map<int, double>::iterator it = ens.begin(); 
            it!= ens.end(); ++it) {
            cout << it->first << " " << it->second << endl;
        }
    
        system("pause");
        //cin << endl;
    }

    62 libyuv 使用

    注意:  libyuv 里面的RGB  都是指的BGR   ARGB 指的是 BGRA

    #ifdef ENABLE_LIBYUV
                if (bpp == 32) {
                    libyuv::ARGBToI420(src[0], src_stride[0], dst[0], dst_stride[0], dst[1], dst_stride[1], dst[2], dst_stride[2],
                        width, height);
                }
                else {
                    libyuv::RGB24ToI420(src[0], src_stride[0], dst[0], dst_stride[0], dst[1], dst_stride[1], dst[2], dst_stride[2],
                        width, height);
                }
                return 0;
    #else

    63   内存泄露

    apt-get install valgrind

    valgrind --leak-check=full --show-reachable=yes --trace-children=yes  ./test

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    int main(void)
    {
        char *ptr = (char*)malloc(10);
        memset(ptr, 0, 10);
    
        strncpy(ptr, "Linux", strlen("Linux"));
    
        printf("
     ptr = [%s]
    ", ptr);
        ptr[0] = 'a';
        printf("
     ptr = [%s]
    ", ptr);
    
        return 0;
    }
    $ valgrind --leak-check=yes ./memcheck
    ==3632== Memcheck, a memory error detector
    ==3632== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
    ==3632== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
    ==3632== Command: ./memcheck
    ==3632== 
    
     ptr = [Linux]
    
     ptr = [ainux]
    ==3632== 
    ==3632== HEAP SUMMARY:
    ==3632==     in use at exit: 10 bytes in 1 blocks
    ==3632==   total heap usage: 1 allocs, 0 frees, 10 bytes allocated
    ==3632== 
    ==3632== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1
    ==3632==    at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
    ==3632==    by 0x8048428: main (memcheck.c:7)
    ==3632== 
    ==3632== LEAK SUMMARY:
    ==3632==    definitely lost: 10 bytes in 1 blocks
    ==3632==    indirectly lost: 0 bytes in 0 blocks
    ==3632==      possibly lost: 0 bytes in 0 blocks
    ==3632==    still reachable: 0 bytes in 0 blocks
    ==3632==         suppressed: 0 bytes in 0 blocks
    ==3632== 
    ==3632== For counts of detected and suppressed errors, rerun with: -v
    ==3632== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

     查看程序是否有内存泄露:

    Mem  一直增加 

    vmstat 1     swp 一直增加

     清除  swpd  

        swapoff -a
        swapon -a

     

     64 auto   遍历map

    for( auto &shader : shaders){
      SAFE_DELETE(shader.second);
    }

    65 lamba 函数  匿名函数

            auto get_bin = [number_of_bins, &original_image](int x, int y)
            {
                const Vector3d pixel_color = original_image.get_rgb(x, y);
                const int bin_r = std::min(static_cast<int>(std::floor(pixel_color(0) * number_of_bins)), number_of_bins - 1);
                const int bin_g = std::min(static_cast<int>(std::floor(pixel_color(1) * number_of_bins)), number_of_bins - 1);
                const int bin_b = std::min(static_cast<int>(std::floor(pixel_color(2) * number_of_bins)), number_of_bins - 1);
                return Vector3i(bin_r, bin_g, bin_b);
            };

    66  多线程

    template<typename Callable>
    void perform_in_parallel(Callable function, int width, int height)
    {
    const int hint = std::thread::hardware_concurrency();
    const int n_threads = std::min(width * height, (hint == 0) ? 4 : hint);
    
    auto inner_loop = [width, height, n_threads, function](const int j)
    {
    const int n = width * height;
    
    const int start_index = j * (n / n_threads);
    const int end_index = (j + 1 == n_threads) ? n : (j + 1) * (n / n_threads);
    
    for (int k = start_index; k < end_index; ++ k) function(k % width, k / width);
    };
    std::vector<std::thread> threads;
    for (int j = 0; j < n_threads; ++ j) threads.push_back(std::thread(inner_loop, j));
    for (auto& t : threads) t.join();
    }

     67  vector  转 char*   

    vector<char> a;
    char* b = &a[0];

    68.   全局变量的声明和定义    在头文件中使用  ,声明使用extern 标识符

    声明: extern ColorUnmixing cu;  (必须在头文件中)

    定义: (必须在main.cpp 中,只能定义一次, 如果没有extern 修饰符,则表示定义该变量)

    #include "unmixing/unmixing.h"
    ColorUnmixing cu;//定义

    69  thread  使用

    bool HelloWorld::init()
    {
        if ( !Layer::init() )
        {
            return false;
        }
        
        std::thread t1(&HelloWorld::myThread,this);//创建一个分支线程,回调到myThread函数里
        t1.join();
    //    t1.detach();
    
    
        CCLOG("in major thread");//在主线程
    
    
        return true;
    }
    
    void HelloWorld::myThread()
    {
        CCLOG("in my thread");
    }

    70   openmp 使用

    #include<omp.h>

    #pragma omp parallel num_threads(4)   //表示使用4个线程  用起来比thread 快
    {
    int index = omp_get_thread_num();
    childFunc(child_pics[index], child_pics_d[index]);
    }//7.3 ms cpu=60%

    71   DLL 的动态加载

    #include <dlfcn.h>
    
    int openDll(const char * so_path, render_contxt & rc)
    {
        char *error;
        void *handle = dlopen("../libemboss.so", RTLD_LAZY);
        if (!handle) {
            fprintf(stderr, "%s
    ", dlerror());
            exit(1);
        }
        dlerror();    /* Clear any existing error */
        rc.init = (__render_libinit)dlsym(handle, "libinit");
        rc.oper = (__render_liboper)dlsym(handle, "liboper");
        rc.stop = (__render_libstop)dlsym(handle, "libstop");
        //dlclose(handle);
        return 0;
    }

     72   linux  编译动态库和静态库   Makefile  

    https://blog.csdn.net/shaoxiaohu1/article/details/46943417

    73 

    编译时使用  public ref class ABC {   ... };

    调用时  右键---引用 --- 添加dll引用  即可

    74   

    A  依赖于  B.a  

    A   B.a 同时依赖于  opencv.so

    编译B.a  :  ar  链接       

    编译A  :-lopencv_world 即可

    75  sizeof

    https://blog.csdn.net/sssssuuuuu666/article/details/80130632

    76  hash  

    unordered_map

    77  设计模式   原理及源代码

    https://www.cnblogs.com/chengjundu/p/8473564.html

    78  FFmpeg   已否决

    不用再取消SDL检查,不用再添加#pragma warning(disable :4996),下面才是正确的解决方法!!

    79   C++ 11  实现信号量

        void second(function<void()> printSecond) {
            std::unique_lock<std::mutex> lk(g_mutex);
            cv1.wait(lk, [this]() {return counter == 2; }); // 阻塞当前线程,直到条件变量被唤醒 
                                                            // printSecond() outputs "second". Do not change or remove this line.
            printSecond();
            counter++;
            cv2.notify_one();
        }

    std::condition_variable cv1;
    std::condition_variable cv2;
    // 使用lock和unlock手动加锁
    std::mutex g_mutex;

     

     80 获取数组中第K大的值

      #include<algorithm>

    nth_element(tmp.begin(), tmp.begin()+m_index, tmp.end());

    81   宏使用大全

    https://blog.csdn.net/Bluechalk/article/details/82490863

    82  ippcc   库使用大全

    http://blog.sina.com.cn/s/blog_635ff3050102wsyz.html

    83

    vector  预分配内存 reserve   vector::size 仍为0!!

    vector 分配元素个数  resize

    84  

    数字转string         to_string(int)

    85   虚函数表

    https://www.cnblogs.com/charlesblc/p/6487336.html

    86  How to create opengl context via drm (Linux)

    https://stackoverflow.com/questions/23139886/how-to-create-opengl-context-via-drm-linux

     

    87  ffmpeg  常见   命令

    https://www.jianshu.com/p/2f9e31dd291f

    88   单例模式

    https://www.cnblogs.com/qiaoconglovelife/p/5851163.html

    89  C++ Win32  编程

    1.ShowWindow(SW_SHOWNORMAL)  参数 :

    SW_HIDE
    激活另外一个窗口,当前窗口就跑到那个窗口后面了
    SW_MAXIMIZE
    显示的窗口是最大化的
    SW_MINIMIZE
    显示的窗口是最小化的,并且自动把另一个窗口显示在前面
    SW_SHOWMAXIMIZED
    显示的窗口是最大化的,没有激活其他窗口的操作
    SW_SHOWMINIMIZED
    显示的窗口是最小化的,没有激活其他窗口的操作
    SW_SHOWMINNOACTIVE
    显示的窗口是最小化的,但窗口并不激活,就是说不显示在最上层,窗口标题栏是灰色的,没有激活其他窗口的操作
    SW_SHOWNA
    按窗口当前大小显示,但不激活,没有激活其他窗口的操作
    SW_SHOWNOACTIVATE
    按窗口最近一次显示时的大小和位置显示,窗口不激活
    SW_SHOWNORMAL
    不管窗口当前状态怎么样,都把它显示出来,并激活窗口

    2. //获取客户端区域

    RECT rect;
    GetClientRect(m_PlayWnd->m_hWnd,&rect);
    InvalidateRect(m_PlayWnd->m_hWnd,&rect,TRUE);

     InvalidateRect  该函数向指定的窗体更新区域添加一个矩形,然后窗口客户区域的这一部分将被重新绘制。

    InvalidateRect(hwnd, NULL, false);重画时不擦除背景

    3.   Win32 显示视频流

    https://blog.csdn.net/leixiaohua1020/article/details/40266503

    4. CreateWindow

    API 函数原型:
    HWND WINAPI CreateWindow(

      _In_opt_  LPCTSTR lpClassName,      // 窗口类名称

      _In_opt_  LPCTSTR lpWindowName,  // 窗口标题

      _In_      DWORD dwStyle,                // 窗口风格,或称窗口格式

      _In_      int x,                                 // 初始 x 坐标

      _In_      int y,                                 // 初始 y 坐标

      _In_      int nWidth,                        // 初始 x 方向尺寸

      _In_      int nHeight,                       // 初始 y 方向尺寸

      _In_opt_  HWND hWndParent,        // 父窗口句柄

      _In_opt_  HMENU hMenu,               // 窗口菜单句柄

      _In_opt_  HINSTANCE hInstance,    // 程序实例句柄

      _In_opt_  LPVOID lpParam              // 创建参数

    );

    注:_In_ 说明该参数是输入的,_opt_ 说明该参数是可选参数(不是说没有参数,而是可以利用宏搭配参数)。

    5.   SetWindowPos    设置窗口位置

    SetWindowPos(Me.hWnd, 0, 0, 1366, 768, 0)

     

     

    90  valgrind  详细使用文档

    http://www.valgrind.org/docs/manual/quick-start.html#quick-start.mcrun

    Error  explanations   ; http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.errormsgs

           

    definitely lost: 确定有内存泄漏,表示在程序退出时,该内存无法回收,也没指针指向该内存(首地址);
    
    indirectly lost: 间接内存泄漏,比如结构体中定义的指针指向的内存无法回收;
    
    possibly lost: 可能出现内存泄漏,比如程序退出时,没有指针指向一块内存的首地址了,但由其他某个指针能推算出首地址;
    
    still reachable: 程序没主动释放内存,在退出时候该内存仍能访问到,比如全局 new 的对象没 delete,由于操作系统会回收,所以此类问题可忽略;
    
    最严重的是 definitely lost 和 indirectly lost,检测结果文件中已给出了具体函数和源文件。

    91   static_cast reinterpret_cast    dynamic_cast

    前面的是C的风格,后面的是C++的风格(也是推荐使用的)。差别在于,static_cast更安全一些,对于指针操作的话,多了一些检查,例如无关指针就无法转换,父类指针向孩子指针,无法转换,常指针向非常指针无法转换,而前面的那个则是通吃,通常是下面四个转换的合体
    reinterpret_cast
    在低级编程以及硬件接口的开发过程中,常常需要将一个特定的物理内存地址赋值给一个指针。为此必须使用
    reinterpret_cast操作符计算地址值。例子如下:
    
    void *p;
    // 将地址 0x5800FF 付给指针 p
    p = reinterpret_cast< void* > (0x5800FF);
    
    static_cast
    通常这个运算符用来进行数值类型间的转化,比如int到float,也可以是自定义的某些数据类型的转化。这个操作符通常也可以用于类指针之间的转化,但是这个运算符在父类到子类的转化中没有做检查并不安全。
    
    dynamic_cast
    这个操作符专门用于指针或者引用操作,也可以进行point -> void 的操作。对父类和子类之间的指针装换这个操作具有类型检查的功能,比较安全!这里要注意的是,如果父类和子类之间没有虚函数(文档称为多态类),那么dynamic_cast不能执行转换,应采用static_cast来进行转换。

    92  右值引用

    https://mp.weixin.qq.com/s?src=3&timestamp=1575598586&ver=1&signature=9f4rYV9MBZ2kbADkjAGQaHVrpS8WOUrpbzC12pflTBFEkNHIJU-zjK2KLlyk-RVltxqpAKdmbwzaNBGRt2dhluKtXI7WV-b7r4VSXlswLKFDRU-7o-vzNlQN0*5OSgoLSj1*-wjPlvNWDZZwTpFGeg==

    93 fread   fseek

    int fseek( FILE *stream, long offset, int origin );

    fseek第一个参数stream为文件指针

    第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移

    第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET

    SEEK_SET: 文件开头

    SEEK_CUR: 当前位置

    SEEK_END: 文件结尾

    其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.

    简言之:

    fseek(fp,100L,0);把文件内部指针移动到离文件开头100字节处;

    fseek(fp,100L,1);把文件内部指针移动到离文件当前位置100字节处;

    fseek(fp,-100L,2);把文件内部指针退回到离文件结尾100字节处。

     

     size_t fread( void * buffer , size_t size , size_t count , FILE * stream );

      功 能:

      从一个文件流中读数据,读取 count个元素 ,每个元素 size字节.如果调用成功返回 值大于count。如不成功,返回实际读取的元素个数,小于count.

     

     

    93  makefile 

     

    $<

    第一个依赖文件的名称。

    $?

    所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。

    $@

    目标的完整名称。

    $^

    所有的依赖文件,以空格分开,不包含重复的依赖文件。

    GCC/G++也提供了链接选项 -Wl,-Bstatic 和 -Wl,-Bdynamic 供用户指定链接动态库或者静态库。

    95   不要试图把.a 文件和 .o 文件链接到一个 .a 文件里 !!!!

    96 g++  链接静态库   

    g++ foo.o libfoo.a -o foo

     

    97  wildcard 扩展通配符   比如编译某个文件夹下所有的.c   就可以用这个函数

    https://blog.csdn.net/xzongyuan/article/details/38082667

     

    g++      参数详解

    https://blog.csdn.net/Sunshine_in_Moon/article/details/50396942

     

    98 剥离输出文件的符号:

    strip exe_d -o exe

     

     

    99 . 判断模板数据类型 

    std::is_same<T, float>::value

     

    100 bazel  教程

    https://docs.bazel.build/versions/master/tutorial/cpp.html

     

     

    101 模板类子类无法访问父类成员    C/C++ --- 符合模式 -- 否

     

    102 gcc 同时链接静态库和动态库

    gcc test.cpp -L. -Wl,-Bdynamic -ltestdll -Wl,-Bstatic -ltestlib  -Wl,-Bdynamic

      103 单例模式

      https://zhuanlan.zhihu.com/p/37469260

    104 ipp 使用方法   点击

    105 匿名函数  lamda

      [](int n)->float {    return n+1;   }   //表明输入是int  输出是float 的函数

    106 线程和协程 区别1.线程和进程: 

    线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。
    2.线程、进程与协程:
    线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员
    协程存在的意义:对于多线程应用,cpu通过切片的方式来切换线程间的执行,线程切换时需要耗时(保持状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。
    协程的适用场景: 当程序中存在大量不需要cpu的操作时(io),适用于协程;

    107 条件变量 互斥锁
    1. wait(unique_lock, [](){return condition;} ) 条件满足时lock, 不满足时unlock 并等待, (lock_guard没有这么高级, lock_guard 会忽略wait 函数, 一直锁住线程)
    wait()会去检查这些条件(过调用所提供的lambda函数), 当条件(lambda函数返回true)
    返回。 如果条件不(lambda函数返回false)wait()函数将解互斥量, 并且将线
    (上段提到的理数据的线)置于阻塞或等待状。 当准数据的线notify_one()通知
    条件理数据的线程从睡眠状醒, 重新取互斥, 并且条件再次检查
    在条件足的情况下, 从wait()返回并继续持有。 当条件不线程将互斥量解
    并且重新开始等待。 就是什么用 std::unique_lock 而不使用 std::lock_guard ——等待中
    线程必在等待期互斥量, 并在这这之后互斥量再次上, 而 std::lock_guard
    么灵活。 如果互斥量在线程休眠期保持住状, 准数据的线程将无法住互斥
    量, 也无法添加数据到列中; 同的, 等待线程也永不会知道条件何时满

    理数据可能是一个耗的操作, 并且如你在第3到的, 你就知道持有
    时间过长是一个多么糟糕的主意。



    107 define 的骚用法 可以实现模板
    define 字符串连接以及变量名分段联结用法
        #define  A(x)            ##x
        #define  B(x)            #@x

        #define  C(x)            #x

    如果我们假设x=a,那么A(a)就是a,B(a)就是‘a’,C(1)就是”a“








  • 相关阅读:
    字符串匹配之朴素匹配
    XSS的攻击原理
    使用metasploit收集邮箱
    C++实现折半插入排序
    C++插入排序实现
    Java中的NIO
    Hashtable和HashMap区别(面试)
    面向对象:封装(一):构造函数;类的主方法;权限修饰符;对象的创建
    switch多分支语句
    递归和字母数字生成随机数
  • 原文地址:https://www.cnblogs.com/luoyinjie/p/7219337.html
Copyright © 2011-2022 走看看