Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++`std::字符串类容器,具有4字节对齐的缓冲区 我需要一个C++中的数据结构,它的作用类似于一个标准的字节容器,但将缓冲区对齐为四字节的倍数。我希望尽可能地重用标准库抽象,而不是滚动我自己的抽象_C++ - Fatal编程技术网

C++`std::字符串类容器,具有4字节对齐的缓冲区 我需要一个C++中的数据结构,它的作用类似于一个标准的字节容器,但将缓冲区对齐为四字节的倍数。我希望尽可能地重用标准库抽象,而不是滚动我自己的抽象

C++`std::字符串类容器,具有4字节对齐的缓冲区 我需要一个C++中的数据结构,它的作用类似于一个标准的字节容器,但将缓冲区对齐为四字节的倍数。我希望尽可能地重用标准库抽象,而不是滚动我自己的抽象,c++,C++,到目前为止,我一直在为此使用std::string和std::vector。不幸的是,我收到了关于最新Mac OS的错误报告,其中显然string::data()不再是4字节对齐的,而是位于与1 mod 4一致的地址。当我看到这一点时,我意识到规范中没有任何东西保证字符串是4字节对齐的。我可以切换到向量,但不幸的是,现在我不确定为什么应该是4字节对齐的。即使使用自定义分配器,vector实现也可能在分配的缓冲区开始时做一些奇怪的事情 我的问题是:从C++标准库中获得一个动态大小的单字节对象的简单

到目前为止,我一直在为此使用
std::string
std::vector
。不幸的是,我收到了关于最新Mac OS的错误报告,其中显然
string::data()
不再是4字节对齐的,而是位于与1 mod 4一致的地址。当我看到这一点时,我意识到规范中没有任何东西保证字符串是4字节对齐的。我可以切换到
向量
,但不幸的是,现在我不确定为什么应该是4字节对齐的。即使使用自定义分配器,
vector
实现也可能在分配的缓冲区开始时做一些奇怪的事情

我的问题是:从C++标准库中获得一个动态大小的单字节对象的简单方法,其中第一个字节位于4字节对齐地址,并且每个字节可以通过<代码>运算符[]/COD> < < /P>访问。


请注意,这与询问如何确保容器使用的分配器返回4字节对齐的内存不同。例如,
std::string
仍然分配4字节对齐内存(实际上可能是8字节),只是在Mac OS上
string::data()
没有指向分配的缓冲区的开始。我看不到规范中有任何东西会阻止
向量做同样的事情,即使目前看来这似乎是可行的。

解决方案之一是在内部使用
std::vector
,封装它,并在使用时将
data()
转换为
无符号字符*

不是最简单的实现方法,但允许重用标准库的最简单方法是编写一个自定义分配器。编写您自己的分配器以获得对齐的地址?可能重复@lilicent虽然该问题的主题看起来重复,但作者将其限制为自定义分配器。我不认为这是重复的,因为自定义分配器不是这里唯一的解决方案。@NathanOliver您有什么理由认为自定义分配器可以工作?
vector
实现不能分配内存,但跳过第一个元素(在
char
s的情况下是一个字节)?不幸的是,这不起作用,因为我需要字节索引访问。因此,在这一点上,我还不如实现我自己的容器。@user3188445确实可以工作,正如我所说的,将指针从
data()
返回到
unsigned char*
,并且您具有字节索引访问权限。但如果我使用的是
std::vector
,我使用的是
std::vector::operator[]
——我不能用转换指针的东西来代替它。而且,
value\u type
等都是错误的。我基本上需要实现我自己的容器,它内部包含一个
std::vector
,在这一点上,我可能只需要实现我自己的容器,即
malloc
。是的,您肯定可以编写自己的容器,但我不确定正确地编写它是否比在
std::vector
上使用薄包装器更简单。我给了你一个解决方案,由你决定使用哪一个。