标签: standard-library

具有自定义指针类型的内存分配器

我试图创建一个使用智能指针的自定义内存分配器.我没有发布代码,因为它太大而且没有添加太多信息.然后我用一个测试它std::vector.它在Xcode上运行得非常好.但是当我尝试在Visual Studio 12(2013)中构建相同的代码时,构建失败并出现以下错误:

... vector(873):错误C2660:' std::_Wrap_alloc< my_allocator< int > >::construct':函数不带2个参数

问题出在push_back方法中:

void push_back(value_type&& _Val)
    {
    ....
        this->_Getal().construct(this->_Mylast,
            _STD forward<value_type>(this->_Myfirst[_Idx]));
    ....
    }
Run Code Online (Sandbox Code Playgroud)

错误消息有点令人困惑.真正的问题是this->_Mylast类型my_allocator< int >::pointer,它是一个智能指针,而构造方法是期望的int*.

所以,问题很简单:自定义内存分配器中使用的指针类型有哪些要求?应该X::pointer可以转换为原始指针?如果是的话,它会让它们变得毫无用处.

实际上我希望这行代码看起来像:

this->_Getal().construct(addressof(*(this->_Mylast)),
            _STD forward<value_type>(this->_Myfirst[_Idx]));
Run Code Online (Sandbox Code Playgroud)

让我们尝试在C++标准中找到答案,其中说:

[17.6.3.5-5]分配器类型X应满足CopyConstructible(17.6.3.1)的要求.的X::pointer,X::const_pointer,X::void_pointer,和X::const_void_pointer类型应满足NullablePointer(17.6.3.3)的要求.对这些类型的构造函数,比较运算符,复制操作,移动操作或交换操作不应通过异常退出.X::pointer并且X::const_pointer还应满足随机访问迭代器的要求(24.2)

如果我们看看NullablePointer reqs,他们会添加一些其他要求:

[17.6.3.3] NullablePointer类型是一种类似指针的类型,支持空值.如果符合以下条件,则类型P满足NullablePointer的要求:
(1.1) - P满足EqualityComparable,DefaultConstructible,CopyConstructible,CopyAssignable和Destructible的要求......

如果我检查随机访问迭代器的要求,我也没有找到任何明确提到它的转换为原始指针.但是在很少的地方使用了方法addressof(例如24.2.1-5).

此外,它并不是Microsoft std::vector实现中唯一X::pointer与假定原始指针相等的地方.我想知道,我错过了什么?

编辑:我将在这里添加一段my_allocator deffinition:

class my_allocator
{
public:

typedef std::size_t          size_type;
typedef std::ptrdiff_t …
Run Code Online (Sandbox Code Playgroud)

c++ pointers memory-management standard-library c++11

12
推荐指数
1
解决办法
1564
查看次数

memchr()如何在引擎盖下工作?

背景: 我正在尝试创建一个纯D语言实现的功能,大致相当于C的memchr,但使用数组和索引而不是指针.原因是std.string将用于编译时功能评估.对于那些不熟悉w/D的人,如果满足某些限制,可以在编译时评估函数.一个限制是它们不能使用指针.另一个是他们不能调用C函数或使用内联汇编语言.使字符串库在编译时工作对于某些编译时代码生成很有用.

问题: memchr如何在引擎盖下工作以尽可能快地执行?在Win32上,我使用简单循环在纯D中创建的任何东西,即使有明显的优化技术,例如禁用边界检查,循环展开等,也至少要慢2倍.有哪些非显而易见的技巧可用于像在字符串中查找字符一样简单?

c performance d standard-library

11
推荐指数
3
解决办法
7322
查看次数

带有二进制数据的C++ fstream <<和>>运算符

我总是阅读并被告知,在处理二进制文件时,应该使用read()和write()而不是<<和>>运算符,因为它们用于格式化数据.我也读过可以使用它们,但它是一个高级主题,我无法找到任何人潜入和讨论的地方.

我最近看到一些代码执行了以下操作:

 std::ifstream file1("x", ios_base::in | ios_base::binary);
 std::ofstream file2("y", ios_base::app | ios_base::binary);

 file1 << file2.rdbuf();

当我指出使用<<运算符和二进制文件时,我被告知rdbuf()调用返回一个streambuf*并且<<重载streambuf*并执行没有格式化的直接复制,因此是安全的.

这是真的还安全吗?效率怎么样?任何陷阱?细节将不胜感激.

谢谢!

c++ iostream standard-library

11
推荐指数
1
解决办法
3611
查看次数

术语"libc"是否等同于"C标准库"?

我有时会听到人们互换使用术语"libc"和"C标准库".我理解"libc"是许多流行的C标准库实现的名称(或名称的一部分).我的猜测是,由于这些实现的广泛使用,人们开始将C标准库称为"libc",尽管它不是官方名称.

将C标准库称为"libc"是否正确?

c terminology libc standard-library

11
推荐指数
2
解决办法
439
查看次数

哪些Scala方法返回null而不是Option,为什么?

我想知道标准库是完全null免费的 - 如果不是 - 会感兴趣的是合理的用例存在哪些返回null比返回一些Option实例更可取.

methods null scala standard-library scala-option

11
推荐指数
2
解决办法
590
查看次数

为什么"懒惰"是关键字而不是标准库类型?

Scala在其标准库中保留了许多非常有用的构造,如Option和Try.

当缺少上述类型的C#等语言选择将其作为库功能实现时,为什么懒惰通过拥有自己的关键字给予特殊处理?

scala standard-library keyword lazy-evaluation

11
推荐指数
2
解决办法
476
查看次数

Jane Street的'Base','Core'和'Core_kernel'有什么区别?

我是OCaml的新手,我经常建议我使用Jane Street的标准库而不是编译器附带的标准库.

然而,似乎有甚至几个的那些,我不知道我应该使用:

任何人都可以快速总结一下这些(也许与电池等)之间的区别,或者何时以及为什么我应该选择其中一个?

ocaml standard-library ocaml-core reason

11
推荐指数
1
解决办法
1197
查看次数

所需的c ++标准库中的所有函数都有外部链接吗?

所以我有一个应用程序可以在windows,linux和一些unix版本上编译.我最近决定在遇到障碍时把它移植到OSX.

我有一个看起来像这样的模板:

template<int (&F)(int)>
int safe_ctype(unsigned char c) { return F(c); }
Run Code Online (Sandbox Code Playgroud)

这个想法是为了防止符号扩展在给定上面的输入值时崩溃某些实现0x7f.它通常像这样使用:

safe_ctype<std::isspace>(ch);
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这不适用于OSX(使用gcc 4.2).该错误与std::isspace没有外部链接有关,因此不适用于模板.事实证明,在OSX上,ctype.h标题具有标记的所有功能(通过宏)static inline.

这是我的问题:

是否允许C++中的函数(在本例中是从C继承的部分)标准库中的函数的任何相关标准都没有外部链接?

编辑:

我从苹果那里听说过.显然他们有一个宏来控制这种行为.定义_DONT_USE_CTYPE_INLINE_可防止ctype函数成为静态内联函数.

c c++ standard-library linkage

10
推荐指数
1
解决办法
478
查看次数

我应该在我的C++标准随机分布上调用reset()来清除隐藏状态吗?

我想用C++ 11标准库中的随机数分布包含简单的函数,这些函数将分布的参数和生成器实例作为参数.例如:

double normal(double mean, double sd, std::mt19937_64& generator)
{
    static std::normal_distribution<double> dist;
    return dist(generator, std::normal_distribution<double>::param_type(mean, sd));
}
Run Code Online (Sandbox Code Playgroud)

我想避免分发对象中的任何隐藏状态,以便每个对此包装函数的调用仅取决于给定的参数.(可能每次调用此函数都可以使用不同的生成器实例.)理想情况下,我会使分发实例static const确保这一点; 但是,分布operator()不是const函数,所以这是不可能的.

我的问题是:为确保分发中没有隐藏状态,是否1)必要且2)足以reset()每次呼叫分配?例如:

double normal(double mean, double sd, std::mt19937_64& generator)
{
    static std::normal_distribution<double> dist;
    dist.reset();
    return dist(generator, std::normal_distribution<double>::param_type(mean, sd));
}
Run Code Online (Sandbox Code Playgroud)

(总的来说,我reset()对随机分布函数的目的感到困惑......我理解为什么生成器有时需要重置/重新设置,但为什么分配对象需要重置?)

c++ random standard-library c++11

10
推荐指数
1
解决办法
2113
查看次数

std :: ops :: Add或core :: ops :: Add?

这两个特征(std :: ops :: Add,core :: ops :: Add)提供相同的功能,并且它们都使用相同的示例(两者都使用std::ops::Add).他们的实施者有所不同.

应该默认使用std::ops::Add吗?为什么两者相对而存在呢?

standard-library rust

10
推荐指数
2
解决办法
1697
查看次数