我想知道是否可行的C++标准库兼容allocator使用(固定大小)缓冲区,它存在于堆栈中.
不知怎的,似乎这个问题在SO上还没有被问过这个问题,尽管它可能已经在其他地方被暗示过了.
所以基本上,它似乎是,只要我去搜索,它应该能够创建一个使用固定大小的缓冲区的分配.现在,乍一看,这应该意味着它应该也有可能有一个使用固定大小的缓冲区,堆栈上的"生活"的分配,但它确实出现,这周围也没有普遍执行等.
让我举一个我的意思的例子:
{ ...
char buf[512];
typedef ...hmm?... local_allocator; // should use buf
typedef std::basic_string<char, std::char_traits<char>, local_allocator> lstring;
lstring str; // string object of max. 512 char
}
Run Code Online (Sandbox Code Playgroud)
这怎么可以实现?
这个问题的答案(感谢R. Martinho Fernandes)链接到来自铬源的基于堆栈的分配器:http://src.chromium.org/viewvc/chrome/trunk/src/base/stack_container.h
然而,这个类似乎非常特殊,特别是因为StackAllocator 它没有默认的ctor - 而且我认为每个分配器类都需要一个默认的ctor.
很多时候我需要一组指针.每次发生这种情况时,我最终都会为指针类型编写一个较少的<>实现 - 将两个指针强制转换为size_t并比较结果.
我的问题是 - 标准中是否提供?我找不到那样的东西.似乎很常见的情况......
更新:似乎即将推出的标准修复了所有问题,并为指针类型和包含的unordered_set提供了较少的<>.几年后,这个问题将毫无意义.
同时,当前标准没有"合法"的解决方案,但size_t演员工作.
更新更新:好吧,我会很惊讶!不只
std::map<void *, int, std::less<void*> > myMap;
Run Code Online (Sandbox Code Playgroud)
工作,但甚至
std::map<void *, int > myMap;
Run Code Online (Sandbox Code Playgroud)
同样.
这是在gcc 3.4.1.我一直在做所有这些演员阵容,而且litb是完全正确的.甚至他引用的章节编号在当前标准中也完全相同.欢呼!
等于运算符对指针的关系运算符有语义限制:
==(等于)和!=(不等于)运算符具有与关系运算符相同的语义限制,转换和结果类型,除了它们的优先级和真值结果.[C++03§5.10p2]
关系运算符对比较指针有限制:
如果同一类型的两个指针p和q指向不是同一个对象的成员或同一个数组的元素或不同函数的不同对象,或者只有其中一个为null,则p <q,p的结果> q,p <= q,p> = q未指定.[§5.9p2]
这是一个由等式运算符"继承"的语义限制吗?
具体来说,给出:
int a[42];
int b[42];
Run Code Online (Sandbox Code Playgroud)
很明显,(a + 3)<(b + 3)是未指定的,但是(a + 3)==(b + 3)也未指定?
还有另外一个问题,询问如何在C++ Std中解释比较指针.
所以我想知道C++ Std在有序标准库(STL)容器中使用指针作为键的含义是什么 - 即允许有一个
std::map<T1*, T2>
这是由于规范std::less或builtin operator <?
函数指针支持的所有操作与原始指针有什么不同?是>,<,<=,> =原始指针支持的运算符如果有,有什么用?
鉴于std::copy(显然对于普通类型)只能作为memmove (*)的包装器实现,我想知道:
memcpy?(我数不清忘记乘以的次数sizeof。)memcpy进行sizeof乘法的包装器是否有任何特定障碍?(*):C++ 标准库实现(从 MSVC 2005(!) 到现代 MSVC2015、libc++ 等)将 TriviallyCopyablestd::copy类型衰减为memmove. 博特不来memcpy。因为:
std::copy(src_first, src_last, destination_first) 定义:
如果
d_first在范围内,则行为未定义[first, last)。
d_first可以在源范围的“左边”,而目标范围可以扩展到源范围内。因为std::memcpy定义是
如果对象重叠,则行为未定义。
对于std::memmove,定义为:
对象可能会重叠:复制的发生就像将字符复制到临时字符数组,然后将字符从数组复制到 dest。
鉴于此,很明显您可以使用std::memove实现std::copyTrivialllyCopyable 类型,因为 memmove 没有强加任何限制,并且可以在编译时通过类型特征分派到正确的实现——
但是很难实现std::copy,memcpy因为 (a) 检查指针范围是否重叠必须 …