随笔分类 -  C/CPP

摘要:NV12属于yuv color space,具有如下的编码格式,基本上yuv420都是这样的编码格式,比如YUV_I420就是上面仍然是Y,下面是先U,然后再V。U占{IMAGE_WIDTH/2,IMAGE_HEIGHT/2}块数据,V同理。具体见:https://wiki.videolan.org 阅读全文
posted @ 2023-01-13 11:24 ijpq 阅读(1564) 评论(0) 推荐(0)
摘要:其实就是翻译了一下cmake文档中的"cmake-language" cmake中的文件使用"cmake语言"来写 一个项目中的cmake文件有如下几种形式 当cmake处理一个项目时,起始点是项目根目录中的cmakelist.txt。这个文件包括了整体的编译细节,其中通过add_subdirect 阅读全文
posted @ 2022-12-29 15:32 ijpq 阅读(70) 评论(0) 推荐(0)
摘要:这一条还是比较简单的,就是说不要返回指向对象内部成分的引用、指针等,即便这个引用可能声明为const(或指针指向了const对象),对内部成分做了保护,但仍有可能造成handle空悬(称为danling)。 为此,举了一个例子: class GUIobject {}; const Rectangle 阅读全文
posted @ 2022-11-20 23:48 ijpq 阅读(26) 评论(0) 推荐(0)
摘要:旧式C转型: T(expression)/(T)expression 新式C++转型:static_cast/dynamic_cast/const_cast/reinterpret_cast 只能通过const_cast去掉const dynamic_cast成本很高,很多编译器的实现都是用了字符串 阅读全文
posted @ 2022-11-20 11:18 ijpq 阅读(23) 评论(0) 推荐(0)
摘要:变量的类型带有构造和析构时,定义一个变量会承受这两个成本,因此在使用时再定义它。例如,如果执行过程中可能被exception中断导致预先定义的变量没有使用,那么这个成本最好不要提前承担。 再比如,不要多承担一次赋值的成本。直接在构造时初始化预期的值。 一种常见的场景:for循环中需要使用某个变量,是 阅读全文
posted @ 2022-11-06 19:23 ijpq 阅读(23) 评论(0) 推荐(0)
摘要:这个条款所说的意思就是,不要把new对象并放入智能指针这个操作放入到一个别的过程之中。 例如,如果把new对象并放入智能指针放入到一个传参过程之中,可能会发生其他参数的执行在new对象并放入智能指针之间发生,如果其他参数的执行发生了异常,那么new出来的对象并没有放入智能指针,就内存泄漏了。 所以, 阅读全文
posted @ 2022-11-06 11:38 ijpq 阅读(16) 评论(0) 推荐(0)
摘要:不要对数组做typedef,会产生很多问题,尽量使用std的string和vector来代替。 new和new一个数组时,内存实际布局有区别,new数组时,会在开头记录数组长度(具体编译器有不同实现,但主流是这样的)。所以调用delete的时候也要用相同形式,否则会误把数组当作单独对象delete, 阅读全文
posted @ 2022-11-06 11:33 ijpq 阅读(25) 评论(0) 推荐(0)
摘要:就是提供一个显示访问原始资源的接口,比如.get()。尽量别用隐式转换,方便了用户,苦了dev。没那么懂的时候,就苦一下用户。 阅读全文
posted @ 2022-11-06 11:01 ijpq 阅读(16) 评论(0) 推荐(0)
摘要:问题:当拷贝一个RAII对象时会发生什么?有以下几种选择 禁止复制 如果复制一个RAII是不合理的,把拷贝构造和拷贝赋值运算符定义为delete就行了。 引用计数 某些资源的RAII对象可以被复制,但是当最后一个RAII对象不再使用时,应该销毁资源。书中用tr1::shared_ptr举例,这个东西 阅读全文
posted @ 2022-11-06 10:00 ijpq 阅读(24) 评论(0) 推荐(0)
摘要:直接使用指针管理对象并不安全,因为 可能忘记delete指针/delete语句并未按照预期执行而提前被exception中断了程序 etc RAII观念:资源取得时机便是初始化时机(说人话就是:管理对象的初始化就应该在获得其期望所管理资源或对象能够获得时). 例如使用工厂函数返回的对象来初始化std 阅读全文
posted @ 2022-11-05 18:40 ijpq 阅读(21) 评论(0) 推荐(0)
摘要:写copying函数(copy构造和copy赋值)时,复制所有local成员变量+调用base的适当coping函数。 如果发现copy构造和copy赋值有相同冗余的代码,消除冗余的方式是将这些代码放入private的一个成员函数中。 阅读全文
posted @ 2022-10-07 17:20 ijpq 阅读(18) 评论(0) 推荐(0)
摘要:出现问题的场景:例如a[i]=a[j]当i=j时,或者*pb=*pa当pa和pb指向同一个对象时。 考虑自我赋值问题,则需要将this和rhs进行判等,但带来巨大开销;考虑异常安全问题,可以先备份原本的成员变量,再令原本的成员变量指向新的副本,最后return *this(如果在做副本时(使用不带n 阅读全文
posted @ 2022-10-07 16:53 ijpq 阅读(17) 评论(0) 推荐(0)
摘要:写这段代码时: int x,y,z; x = y = z = 10; 实际上operator+返回的是左值引用,以保证x=y=z=10实际上是x=(y=(z=10)); 阅读全文
posted @ 2022-10-07 16:05 ijpq 阅读(24) 评论(0) 推荐(0)
摘要:在derived对象的base构造期间,对象类型是base,而不是derived。对象只有在derived构造之后才会成为derived 第1条的解决方法,是将构造、析构中的virtual改为non-virtual。然后把derived的信息传给base构造所调用的non-virtual (想想之前 阅读全文
posted @ 2022-10-07 16:00 ijpq 阅读(22) 评论(0) 推荐(0)
摘要:如果析构函数调用的函数会抛出异常,则析构函数可以捕获这个异常并且吞掉它,并且继续执行析构过程。 阅读全文
posted @ 2022-10-07 15:22 ijpq 阅读(19) 评论(0) 推荐(0)
摘要:如果基类的析构是non-virtual的,在使用base class指针指向一个derived对象,并且这个对象由base class指针删除时,derived对象的成分并没有被删除,原因是base class定义了一个non virtual析构(因此无法动态绑定)。所以目前看解决方法就是把这个ba 阅读全文
posted @ 2022-10-04 12:43 ijpq 阅读(30) 评论(0) 推荐(0)
摘要:在c++11标准中已经被=delete代替。 阅读全文
posted @ 2022-10-03 18:59 ijpq 阅读(27) 评论(0) 推荐(0)
摘要:一个类,如果没有声明构造,编译器会声明:default构造。编译器还会声明copy构造、copy赋值、析构(如果自己没有声明) 编译器声明版本的copy构造、copy赋值 将每一个non static成员拷贝到目标对象。 含有引用成员、const成员的,编译器版本的copy拒绝生成。因为引用不能修改 阅读全文
posted @ 2022-09-25 22:04 ijpq 阅读(25) 评论(0) 推荐(0)
摘要:记忆所有的初始化规则非常困难,所以手动初始化 不要搞混初始化和赋值 在构造函数中使用赋值操作的是赋值,不是初始化。对于非内置数据类型,这个赋值操作还得先调用他们自己的default构造函数,再进行赋值。效率会很低。因此在当前构造函数中直接使用初始化列表会是最优解,效率高,因为初始化列表直接完成了初始 阅读全文
posted @ 2022-09-12 11:42 ijpq 阅读(33) 评论(0) 推荐(0)
摘要:https://en.cppreference.com/w/cpp/language/storage_duration https://en.cppreference.com/book/storage_durations https://en.cppreference.com/w/cpp/langu 阅读全文
posted @ 2022-08-24 15:01 ijpq 阅读(18) 评论(0) 推荐(0)