#如何获取指针变量指向的内存空间,分配了多少大小

#如何获取指针变量指向的内存空间,分配了多少大小

Karthik Iyengar 的nanolog github 来源
两个疑问,在代码里有写,

#include <iostream>
#include <thread>
#include <chrono>
#include <vector>

#include <atomic>
// 目的是为了看看线程这个指针变量// 指针就是数组,数组就是指针,退化的转变不回来了
struct SpinLock
    {
	SpinLock(std::atomic_flag & flag) : m_flag(flag)
	{
	    while (m_flag.test_and_set(std::memory_order_acquire));
	}

	~SpinLock()
	{
	    m_flag.clear(std::memory_order_release);
	}

    private:
	std::atomic_flag & m_flag;
    };


// 假设定义了NanoLogLine和SpinLock类
struct Person {
    int i{0};

    void printI() {
        std::cout << "i = " << i << std::endl;
    }

    void setI(int newValue) {
        i = newValue;
    }
};

enum class LogLevel {
    INFO
};



class RingBuffer {
public:
    struct Item {
        Item()
            : flag{ATOMIC_FLAG_INIT}
            , written(0) {
        }

        std::atomic_flag flag;
        char written;
        char padding[256 - sizeof(std::atomic_flag) - sizeof(char) - sizeof(Person)];
        Person logline;
    };

    RingBuffer(size_t const size)
        : m_size(size)
        , m_ring(static_cast<Item*>(std::malloc(size * sizeof(Item))))
        , m_write_index(0)
        , m_read_index(0) {
        for (size_t i = 0; i < m_size; ++i) {
            new (&m_ring[i]) Item();
        }
        static_assert(sizeof(Item) == 256, "Unexpected size != 256");
    }

    ~RingBuffer() {
        for (size_t i = 0; i < m_size; ++i) {
            m_ring[i].~Item();
        }
        std::free(m_ring);
    }

    void push(Person&& logline)  {
        unsigned int write_index = m_write_index.fetch_add(1, std::memory_order_relaxed) % m_size;
        Item& item = m_ring[write_index];
        SpinLock spinlock(item.flag);
        item.logline = std::move(logline);
        item.written = 1;
    }

    bool try_pop(Person& logline)  {
        Item& item = m_ring[m_read_index % m_size];
        SpinLock spinlock(item.flag);
        if (item.written == 1) {
            logline = std::move(item.logline);
            item.written = 0;
            ++m_read_index;
            return true;
        }
        return false;
    }

    RingBuffer(RingBuffer const&) = delete;
    RingBuffer& operator=(RingBuffer const&) = delete;


        // 怎么获取m_ring 变量的内存大小
    int get_size_of_m_ring(){
        return m_ring.size();
    }
public:
    size_t const m_size;
    Item* m_ring;
    std::atomic<unsigned int> m_write_index;
    char pad[64]; // do wut // 使得? 作用?
    unsigned int m_read_index;
};


int main() {
    const size_t bufferSize = 10;
    RingBuffer buffer(bufferSize);

    // 启动一个生产者线程,模拟往环形缓冲区中推送日志

    
    std::cout << "Address of buffer.m_ring: " << sizeof(bufferSize) << std::endl; // 8 + 8 + 4 + 64 + 4
    // std::cout << "Address of buffer.m_ring: " << &(buffer.m_ring) << std::endl;

    std::thread producer([&]() {
        for (int i = 0; i < 2; ++i) {
            Person logline;
            logline.setI(i);
            buffer.push(std::move(logline));
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
        }
    });

    // 启动一个消费者线程,模拟从环形缓冲区中弹出日志
    std::thread consumer([&]() {
        for (int i = 0; i < 2; ++i) {
            Person logline;
            if (buffer.try_pop(logline)) {
                std::cout << "i value: " ;
                logline.printI() ;
                std::cout << std::endl;
            } else {
                std::cout << "Buffer is empty." << std::endl;
            }
            std::this_thread::sleep_for(std::chrono::milliseconds(200));
        }
    });

    std::cout << "Address of buffer.m_ring: " << &(buffer.m_ring) << std::endl;


    producer.join();
    consumer.join();



    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值