美文网首页
2022-06-14C++见闻

2022-06-14C++见闻

作者: SMSM | 来源:发表于2022-06-22 10:47 被阅读0次
    1. 只允许对象方式使用并且不能走赋值构造和copy构造。 操作符重载、构造都禁用掉
      SkAutoCanvasRestore(SkAutoCanvasRestore&&) = delete;
      SkAutoCanvasRestore(const SkAutoCanvasRestore&) = delete;
      SkAutoCanvasRestore& operator=(SkAutoCanvasRestore&&) = delete;
      SkAutoCanvasRestore& operator=(const SkAutoCanvasRestore&) = delete;

    https://www.cnblogs.com/wangguchangqing/p/6141743.html 深浅copy

    1. static
      C中的static的作用是,a. 隐藏作用域(不能跨文件,可以是文件内或者函数体内) b.提供进程级别的生命周期
      C++中static的作用,a.可以跨文件的 b.进程生命周期。要实现隐藏作用域的话,可以使用匿名命名空间,同文件内可以访问。

    namespace {
    struct Helpers {
    static size_t getTypeSize(uint8_t type) {}
    }

    size_t tagSize = Helpers::getTypeSize(tagType);

    1. SK_API int maxSurfaceSampleCountForColorType(SkColorType) const;
    1. 成员函数修饰符总结
      =0 声明为纯虚函数(java interface 或者 abstract虚类 )不可被new
      final 禁止继承
      const 会影响到函数签名,代表函数体内,不存在修改操作。
      override 声明为继承关系,继承必须是virtual(虚表)
      = default
      = delete
      虚函数是可以有默认实现的。子类可覆盖走多态。

    virtual void willSave() {}
    virtual void ValidateStateStackWithCanvas(const cc::PaintCanvas) const = 0;
    void ValidateStateStackWithCanvas(const cc::PaintCanvas
    ) const final;

    A.class
    virtual const char* GetIdentifier() const { return ""; }
    B.class
    API_EXPORT virtual const char *GetIdentifier() const override = 0;
    C.class
    const char *GetIdentifier() const override {
    return TYPE_NAME_CANVAS;
    }

    1.  std::atomic<ANativeWindow *> system_native_window;
      
    2. class和struct的区别 。 默认作用域修饰符不一样。class是private 而struct是public的。struct无法使用模板。

    struct ListOffsets {
    jclass clazz;
    jmethodID add;
    } gListOffsets;

    这是干啥呢?

    7 . 返回引用作为builder模式
    SkM44& setIdentity() {
    *this = { 1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1 };
    return *this;
    }

    8 .使用 weak_ptr用于探测object是否已释放。ObjectLifeChecker 。
    enable_shared_from_this 整个必须要求,std::make_shared<AA>(args)的方式创建,后续才可以在内部调用 shared_from_this()(https://en.cppreference.com/w/cpp/memory/enable_shared_from_this

    还有weak_ptr的lock()后的判等

    inline _LIBCPP_INLINE_VISIBILITY
    bool
    operator!=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT
    {
    return static_cast<bool>(__x);
    }

    _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return get() != 0;}
    

    bool也可以作为符号重载的。

    更进一步背景可以看下:c++ 值语义和对象语 义的区别

    9 . Skia中对内存的管理。
    满足了谁申请谁释放的原则。
    满足了对外跟节点是shared_ptr。来统一管理内部资源。如果要已指针方式对外暴露内部资源,则最好确定用智能指针。

    sk_sp<SkSurface>          mRenderTarget;
    

    SkCanvas* SkSurface::getCanvas() {

    std::unique_ptr<SkCanvas>   fCachedCanvas;
    

    SkCanvas* SkSurface_Base::getCachedCanvas() {
    if (nullptr == fCachedCanvas) {
    fCachedCanvas = std::unique_ptr<SkCanvas>(this->onNewCanvas());
    if (fCachedCanvas) {
    fCachedCanvas->setSurfaceBase(this);
    }
    }
    return fCachedCanvas.get();
    }

    auto canvas = skottieAnimation_->mRenderTarget->getCanvas();

    1. static_cast 和 reinterpret_cast的区别
      https://www.zhihu.com/question/46470823
      static_cast 不允许没有关系的两个类指针之间的转换.

    10 . mutex锁 和 原子atomic变量 。
    C++中的 https://cloud.tencent.com/developer/article/1637791 volatile 可以避免优化、强制内存读取的顺序,但是 volatile 并没有线程同步的语义。atomic对资源是有原子性的。
    锁保障的是,一组操作的安全性,事务。

    C++基础 下午留3个小时吧。不知道够不够呀。

    https://yuque.antfin-inc.com/sre/sre-infra/mmhd4b 今天可以看完的吧。
    C++基础面试题 https://yuque.antfin-inc.com/cn-infrastructure/cn-middleware/he2got

    RTTI dynamic_cast 用于运行时安全的up转移,只适用于包含虚函数的类。或者用于判断基类指针的派生类是哪个 。p指向一个对象﹐但欲得知此对象之类资料。使用的场合:异常处理(exceptions handling)获取类名、动态转类型(dynamic casting)
    Lens::BridgeImpl *bridge = reinterpret_cast<Lens::BridgeImpl *>(nativePtr);

    1. 引用
      1. 引用不占用内存
      2. 引用作为参数传递的好处是,比传递对象减少了copy、比传递指针调用更友好并且不易产生泄漏因为无法限制指针赋值给全局变量。
        1. 引用与指针的区别是什么?
          ○ 引用必须被初始化,指针不必。
          ○ 引用初始化以后不能被改变,指针可以改变所指的对象。
          ○ 不存在指向空值的引用,但是存在指向空值的指针。
    2. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?
      1. 多态的作用。面向接口编程。 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;
      1. static有什么用途
        ○ 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
        ○ 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
        ○ 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用
        在类内部,则可以跨文件访问,假如只想限定到类内部,可以使用匿名空间
    3. 想要多态就必须是定义为 虚函数
    4. delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。
    5. C++笔试题 https://yuque.antfin-inc.com/cn-infrastructure/cn-middleware/he2got https://yuque.antfin-inc.com/sre/sre-infra/mmhd4b https://yuque.antfin-inc.com/aone/cd/ob6gke
      1. 说一下几种常见的排序算法和分别的复杂度。[TODO]
        1. O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n^2)平方阶 < O(n^3)(立方阶) < O(2^n) (指数阶)
        2. sin cos tan logn
      2. 什么是协程(用户态线程,减少数据拷贝,降低CPU开销,无callback函数),实现原理[TODO]
    1. C++基础原理
      1. ● dynamic_cast和static_cast区别,为什么dynamic_cast能做到类型检查。
        ● new和malloc区别,new实际上执行了什么操作,可能在什么步骤出现异常
        ● 虚继承的细节,纯虚函数。【done】
        ● 智能指针的作用和实现,auto_ptr和share_ptr区别,循环引用,weak_ptr
      • 线程和锁的使用 mudex atomic volatile
      • std::string转char* new char[str.length()+1] 。 假如不copy而是直接 char *p = str.c_str(),很容易野指针的。因为str的作用域小。
    2. C++工程实践
      1. 动态库对外暴露接口 https://www.cnblogs.com/Solstice/archive/2011/03/13/1982563.html
        1. 以全局(含 namespace 级别)函数为接口、以 class 的 non-virtual 成员函数为接口、以 virtual 函数为接口(interface)。
        2. 基础动态库更新。接口兼容性。
        3. 如何回调。function。函数指针。{...}
        4. 虚函数的坏处。
          1. 有继承并且为外部so时,当父类新增虚函数,虚表更更新,因为外部so未重新打包,子类的续表无法和父类同步,导致向上转型时,父类view视图看到新增虚函数的offset在子类中不存在导致的 调用错误函数 或者 错误地址。而不兼容。
          2. 如果无继承时,虚函数的顺序,就是offset的数值,不能删除、调换顺序。
          3. 加载so时,没有 linker对符号校验、裁决的过程。
          4. 要解决的话,可以接口集成。没新增发布一个版本,就新增一个子类接口。这样保障虚表的不变性。
          5. 禁止外部使用虚函数
        5. 版本。用大小版本,代表是否可兼容。小团队,则每次所有so重新打包即可。大团队的话,接口兼容的保障。
        6. 本文主要在“头文件和库文件分别升级,可执行文件是否受影响”这个意义下讨论,我称之为 library (主要是 shared library,即动态链接库)的 ABI (application binary interface)。
      2. 对外提供一个稳定的版本兼容的头文件。虚函数。并且头文件路径区分public和private。
      3. JNI层JAVA对象的管理 传递。内存的管理。 https://www.cnblogs.com/oxgen/archive/2012/03/05/2381059.html
      4. extern "C" 关于函数签名
      5. Cmake ninja 参数命令
    3. C++笔试题
    4. 实现一个生产消费模式。多线程的。[TODO]

    build模式
    SkM44& setIdentity() {
    *this = { 1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1 };
    return *this;
    }

    编译器error

    if DEBUG_OPENGL >= DEBUG_LEVEL_HIGH && !defined(HWUI_GLES_WRAP_ENABLED)

    error Setting DEBUG_OPENGL to HIGH requires setting HWUI_ENABLE_OPENGL_VALIDATION to true in the Android.mk!

    endif

    .cpp
    memset(_heightmapResolution, 0, sizeof(int) * 2);

    ----static作用域
    .cpp
    namespace ant3dengine
    {
    static EncoderArguments* __instance;
    }

    .h
    class EncoderArguments{
    static EncoderArguments* getInstance();
    }

    -----利用引用减少COPY 利用右值
    void EncoderArguments::readOption(const std::vector<std::string>& options, size_t* index)
    const std::string& str = options[*index];

    ----virtual、const用途
    .h
    virtual unsigned int getTypeId(void) const;
    虚函数在虚标中,结尾的const的用途呢

    相关文章

      网友评论

          本文标题:2022-06-14C++见闻

          本文链接:https://www.haomeiwen.com/subject/pxozmrtx.html