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
上使用薄包装器更简单。我给了你一个解决方案,由你决定使用哪一个。