Skip to content

Latest commit

 

History

History
182 lines (116 loc) · 5.79 KB

013.md

File metadata and controls

182 lines (116 loc) · 5.79 KB
layout title
post
第十三期

C++ 中文周刊 第13期

reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态。

每周更新

周刊项目地址 github在线地址知乎专栏

欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue


资讯

编译器信息最新动态推荐关注hellogcc公众号

本周周报github直达

文章

  • Modules介绍

  • GCC 的整体架构

    介绍了gcc的架构以及处理流程,值得一看,拓展眼界

  • tuple实现

    介绍了tuple中的空基类优化

  • Practical Design Patterns: Opaque Pointers and Objects in C

    看代码

    Ringbuffer.h

    #pragma once
    
    #include <stdint.h>
    #include <stdbool.h>
    
    // Opaque pointer type to represent a ringbuffer instance
    // 作者管这个叫opaque pointer
    typedef struct ringbuffer_instance_t* ringbuffer_t;
    
    // Functions that operate on an instance
    ringbuffer_t ringbuffer_create(uint32_t capacity);
    uint32_t ringbuffer_capacity(ringbuffer_t instance);
    bool ringbuffer_enqueue(ringbuffer_t instance, uint8_t item);
    bool ringbuffer_dequeue(ringbuffer_t instance, uint8_t* item);
    void ringbuffer_destroy(ringbuffer_t instance);
    

    ringbuffer.c

    #include "ringbuffer.h"
    #include <stdlib.h>
    
    // Private struct, only accessible from within this file
    struct ringbuffer_instance_t {
        volatile uint32_t wr_pos;
        volatile uint32_t rd_pos;
        uint8_t* data;
        uint32_t capacity;
    };
    
    ringbuffer_t ringbuffer_create(uint32_t capacity) {
        ringbuffer_t inst = calloc(1, sizeof(struct ringbuffer_instance_t));
        inst->data = calloc(capacity, sizeof(uint8_t));
        inst->capacity = capacity;
        inst->wr_pos = 0;
        inst->rd_pos = 0;
        return inst;
    }
    
    uint32_t ringbuffer_capacity(ringbuffer_t instance) {
        return instance->capacity;
    }
    
    bool ringbuffer_enqueue(ringbuffer_t instance, uint8_t item) {
        // implementation omitted
        return true;
    }
    
    bool ringbuffer_dequeue(ringbuffer_t instance, uint8_t* item) {
        // implementation omitted
        return true;
    }
    
    void ringbuffer_destroy(ringbuffer_t instance) {
        if (instance) {
            if (instance->data) {
                free(instance->data);
            }
            free(instance);
        }
    }

    作者管这个ringbuffer_t叫opaque pointer实际上就是一层不透明封装,当handle用。这个不是什么新的技巧了

    暮无井见铃06-02 评论补充

    Opaque pointer 就是 pImpl 的另一种习惯说法……其实很古老了,例如 C 标准都是允许 FILE 在头文件中仅声明不定义的。

  • Ambiguity in template parameters

    讨论了一下模版NTTP和其他类型和concept一锅烩等场景,看个乐

  • Porting Intel Intrinsics to Arm Neon Intrinsics

    手把手教你写sse移植代码(从x86到arm)

  • c++ tip of week 226 Did you know about C++23 feature which adds support for inheriting from std::variant?

std::variant支持继承,再实现operator()更方便std::visit 在线演示godbolt

struct value : std::variant<int, double> {
  using variant::variant;

  constexpr auto operator()(const auto& value) {
    std::clog << value << '\n';
  }
};

int main(){
  std::visit(value{}, std::variant<int, double>(42));  // prints 42
  std::visit(value{}, std::variant<int, double>(99.)); // prints 99
}

视频

讲的代码设计重构之类的。没有仔细看

<iframe width="560" height="315" src="https://www.youtube.com/embed/w2L3Vz5X8JU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

项目


本文永久链接