gpt4 book ai didi

c++ - 包装二进制缓冲区 - 可能没有多余的移动/复制?

转载 作者:行者123 更新时间:2023-11-30 02:26:15 26 4
gpt4 key购买 nike

公平警告,我是 C++ 新手。因此,我的部分或全部假设可能是错误的。

考虑以下几点:

#include <cstddef>
#include <cstdio>

template <typename T>
class StaticData {
private:
const T* data = nullptr;
std::size_t size;
public:
StaticData(const T* data, std::size_t size) : data(data), size(size) { }
const T* GetData() {
return this->data;
}
std::size_t GetSize() {
return this->size;
}
};

const unsigned char foo[] = { 0x66, 0x6F, 0x6F };
// Possible to initialize this class with data directly?
StaticData<unsigned char> SDFoo = StaticData<unsigned char>(foo, sizeof(foo));

int main() {
std::printf("%p (%lu)\n", foo, sizeof(foo));
std::printf("%p (%lu)\n", SDFoo.GetData(), SDFoo.GetSize());
}

使用这段代码,我将 foo 包装在一个(不完整的)类中,该类包含数据及其值。我对修改包含的数据没有兴趣,我只是想要一个安全的包装器,它的大小始终可用。我首先尝试了 std::array,但它有一个不幸的副作用,那就是将大小作为其类型的一部分,而且我不能将不同大小的数组放入容器中,例如 std::unordered_map.

这种方法的唯一问题是 foo 仍在全局范围内。为了安全起见,我宁愿容器类 SDFoo 是唯一可见的东西(也许是 Foo)。但是,我想不出一种方法来摆脱 foo 而不会在静态初始化时引入不必要的移动或复制整个缓冲区。

有什么想法吗?

编辑:明确地说,我想知道是否有办法以某种方式摆脱额外的 foo 变量。

最佳答案

(据我所知)从全局内存中消除 foo 变量的唯一方法是在 StaticData 对象本身内部分配数据拷贝。你可以使用 std::shared_ptr (允许您复制 StaticData 而无需额外复制其数据)和 std::initializer_list帮助你,例如:

#include <initializer_list> 
#include <memory>

template <typename T>
class StaticData {
private:
const T* m_data;
std::size_t m_size;
std::shared_ptr<T[]> m_storage;

public:
StaticData(const T* data, std::size_t size)
: m_data(data), m_size(size)
{
}

StaticData(const std::initializer_list<T> &data)
: m_storage(new T[data.size()]), m_data(m_storage.get()), m_size(data.size())
{
std::copy(data.begin(), data.end(), m_storage.get());
}

const T* GetData() const
{
return m_data;
}

std::size_t GetSize() const
{
return m_size;
}
};

StaticData<unsigned char> SDFoo({ 0x66, 0x6F, 0x6F });

void bar(const char *str)
{
StaticData<char> SDBar(str, strlen(str));
std::printf("SDBar: %p (%lu)\n", SDBar.GetData(), SDBar.GetSize());
}

int main()
{
std::printf("SDFoo: %p (%lu)\n", SDFoo.GetData(), SDFoo.GetSize());
bar("baz");
return 0;
}

关于c++ - 包装二进制缓冲区 - 可能没有多余的移动/复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43057953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com