相关疑难解决方法(0)

基于堆栈缓冲的STL分配器?

我想知道是否可行的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.

c++ stack stl allocator

37
推荐指数
3
解决办法
1万
查看次数

对C++标准中的指针通用少<>

很多时候我需要一组指针.每次发生这种情况时,我最终都会为指针类型编写一个较少的<>实现 - 将两个指针强制转换为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++

31
推荐指数
1
解决办法
8881
查看次数

将指针与不同数组进行比较以获得相等性是否是未指定的行为?

等于运算符对指针的关系运算符有语义限制:

==(等于)和!=(不等于)运算符具有与关系运算符相同的语义限制,转换和结果类型,除了它们的优先级和真值结果.[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++ standards pointers unspecified-behavior

16
推荐指数
3
解决办法
2565
查看次数

是否允许指针作为有序STL容器中的键?

还有另外一个问题,询问如何在C++ Std中解释比较指针.

所以我想知道C++ Std在有序标准库(STL)容器中使用指针作为键的含义是什么 - 即允许有一个

std::map<T1*, T2>

这是由于规范std::lessbuiltin operator <

c++ standards containers pointers

7
推荐指数
1
解决办法
5819
查看次数

C/C++中原始指针和函数指针支持的操作是什么?

函数指针支持的所有操作与原始指针有什么不同?是>,<,<=,> =原始指针支持的运算符如果有,有什么用?

c c++ pointers function-pointers

6
推荐指数
1
解决办法
3302
查看次数

memcpy 的类型安全 C++ 包装器?

鉴于std::copy(显然对于普通类型)只能作为memmove (*)的包装器实现,我想知道:

  • 是否有适合您需要的标准 C++ 类型安全包装器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定义是

    如果对象重叠,则行为未定义。

    • 也就是说,整个范围不能重叠:这就是让 memcpy 成为最快变体的原因,因为它可以假设源和目标的内存完全不相交。
  • 对于std::memmove,定义为:

    对象可能会重叠:复制的发生就像将字符复制到临时字符数组,然后将字符从数组复制到 dest。

    • 即源和目的范围可以任意重叠,没有限制。

鉴于此,很明显您可以使用std::memove实现std::copyTrivialllyCopyable 类型,因为 memmove 没有强加任何限制,并且可以在编译时通过类型特征分派到正确的实现——

但是很难实现std::copymemcpy因为 (a) 检查指针范围是否重叠必须 …

c++ memcpy

5
推荐指数
1
解决办法
1288
查看次数