假设我有以下内容:
#include <memory>
struct A { int x; };
class B {
B(int x, std::unique_ptr<A> a);
};
class C : public B {
C(std::unique_ptr<A> a) : B(a->x, std::move(a)) {}
};
Run Code Online (Sandbox Code Playgroud)
如果我正确理解有关"未指定函数参数顺序"的C++规则,则此代码不安全.如果B构造函数的第二个参数首先使用移动构造函数构造,那么a现在包含一个nullptr表达式a->x将触发未定义的行为(可能是段错误).如果首先构造第一个参数,那么一切都将按预期工作.
如果这是一个正常的函数调用,我们可以创建一个临时函数:
auto x = a->x
B b{x, std::move(a)};
Run Code Online (Sandbox Code Playgroud)
但是在类初始化列表中,我们没有自由创建临时变量.
假设我无法改变B,有没有可能的方法来实现上述目标?即unique_ptr在不创建临时的情况下解除引用并移动相同的函数调用表达式?
如果您可以更改B构造函数但不添加新方法,该setX(int)怎么办?那会有帮助吗?
谢谢
c++ initialization move-semantics unspecified-behavior c++11
根据isascii()手册页:
http://linux.die.net/man/3/isascii
POSIX.1-2008将isascii()标记为已过时,并指出它无法在本地化应用程序中进行移植.
我不确定我看到可移植性问题在哪里.这个函数的一个非常简单的实现是:
int isascii(int ch) { return ch >= 0 && ch < 128; }
Run Code Online (Sandbox Code Playgroud)
在哪种情况下上述实现不充分或不可移植?
谢谢
有没有什么办法的类型参数包从转换为整数的参数包0来sizeof...(Types)?更具体地说,我正在尝试这样做:
template <size_t... I>
void bar();
template <typename... Types>
void foo() {
bar<WHAT_GOES_HERE<Types>...>();
}
Run Code Online (Sandbox Code Playgroud)
例如,foo<int,float,double>()应该打电话bar<0, 1, 2>();
在我的用例中,参数包Types可能多次包含相同的类型,因此我无法搜索包以计算给定类型的索引.
这是一篇很好的文章,讨论了低级优化技术,并展示了一个例子,即作者将昂贵的部门转换为廉价的比较. https://www.facebook.com/notes/facebook-engineering/three-optimization-tips-for-c/10151361643253920
对于那些不想点击的人,基本上他转换了这个:
uint32_t digits10(uint64_t v) {
uint32_t result = 0;
do {
++result;
v /= 10;
} while (v);
return result;
}
Run Code Online (Sandbox Code Playgroud)
进入:
uint32_t digits10(uint64_t v) {
uint32_t result = 1;
for (;;) {
if (v < 10) return result;
if (v < 100) return result + 1;
if (v < 1000) return result + 2;
if (v < 10000) return result + 3;
// Skip ahead by 4 orders of magnitude
v /= 10000U;
result += 4;
} …Run Code Online (Sandbox Code Playgroud) 我正在实现一个高效的文本文件加载器,并在这篇文章中从 GNU grep 的作者那里找到了一些很好的建议:http : //lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html
他建议的一件事是将页面对齐的数据块调用 read() 到页面对齐的缓冲区中。显然,这允许内核避免一些额外的缓冲。
我一直在寻找,但没有听到其他人支持这一说法。将 read() 调用到页面对齐的缓冲区(可能使用 mmap/posix_memalign 等分配)实际上更有效吗?如果它不是真的,它是否曾经是真的?它是否严重依赖于底层文件系统或其他类似因素?
谢谢!