我试图创建一个使用智能指针的自定义内存分配器.我没有发布代码,因为它太大而且没有添加太多信息.然后我用一个测试它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) 背景: 我正在尝试创建一个纯D语言实现的功能,大致相当于C的memchr,但使用数组和索引而不是指针.原因是std.string将用于编译时功能评估.对于那些不熟悉w/D的人,如果满足某些限制,可以在编译时评估函数.一个限制是它们不能使用指针.另一个是他们不能调用C函数或使用内联汇编语言.使字符串库在编译时工作对于某些编译时代码生成很有用.
问题: memchr如何在引擎盖下工作以尽可能快地执行?在Win32上,我使用简单循环在纯D中创建的任何东西,即使有明显的优化技术,例如禁用边界检查,循环展开等,也至少要慢2倍.有哪些非显而易见的技巧可用于像在字符串中查找字符一样简单?
我总是阅读并被告知,在处理二进制文件时,应该使用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*并执行没有格式化的直接复制,因此是安全的.
这是真的还安全吗?效率怎么样?任何陷阱?细节将不胜感激.
谢谢!
我有时会听到人们互换使用术语"libc"和"C标准库".我理解"libc"是许多流行的C标准库实现的名称(或名称的一部分).我的猜测是,由于这些实现的广泛使用,人们开始将C标准库称为"libc",尽管它不是官方名称.
将C标准库称为"libc"是否正确?
我想知道标准库是完全null免费的 - 如果不是 - 会感兴趣的是合理的用例存在哪些返回null比返回一些Option实例更可取.
Scala在其标准库中保留了许多非常有用的构造,如Option和Try.
当缺少上述类型的C#等语言选择将其作为库功能实现时,为什么懒惰通过拥有自己的关键字给予特殊处理?
我是OCaml的新手,我经常建议我使用Jane Street的标准库而不是编译器附带的标准库.
然而,似乎有甚至几个的那些,我不知道我应该使用:
任何人都可以快速总结一下这些(也许与电池等)之间的区别,或者何时以及为什么我应该选择其中一个?
所以我有一个应用程序可以在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++ 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()对随机分布函数的目的感到困惑......我理解为什么生成器有时需要重置/重新设置,但为什么分配对象需要重置?)
这两个特征(std :: ops :: Add,core :: ops :: Add)提供相同的功能,并且它们都使用相同的示例(两者都使用std::ops::Add).他们的实施者有所不同.
应该默认使用std::ops::Add吗?为什么两者相对而存在呢?
standard-library ×10
c++ ×4
c ×3
c++11 ×2
scala ×2
d ×1
iostream ×1
keyword ×1
libc ×1
linkage ×1
methods ×1
null ×1
ocaml ×1
ocaml-core ×1
performance ×1
pointers ×1
random ×1
reason ×1
rust ×1
scala-option ×1
terminology ×1