小编Mat*_*nte的帖子

移动语义和功能顺序评估

假设我有以下内容:

#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

49
推荐指数
3
解决办法
2789
查看次数

为什么弃用isascii()?

根据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)

在哪种情况下上述实现不充分或不可移植?

谢谢

c c++ ascii posix libc

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

C++将类型的参数包转换为索引的参数包

有没有什么办法的类型参数包从转换为整数的参数包0sizeof...(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可能多次包含相同的类型,因此我无法搜索包以计算给定类型的索引.

c++ templates variadic-templates c++11 c++14

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

优化:昂贵的分支与廉价的比较

这是一篇很好的文章,讨论了低级优化技术,并展示了一个例子,即作者将昂贵的部门转换为廉价的比较. 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)

c++ optimization caching branch-prediction

2
推荐指数
1
解决办法
2094
查看次数

Linux 上的 read() 和页面对齐的缓冲区

我正在实现一个高效的文本文件加载器,并在这篇文章中从 GNU grep 的作者那里找到了一些很好的建议:http : //lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html

他建议的一件事是将页面对齐的数据块调用 read() 到页面对齐的缓冲区中。显然,这允许内核避免一些额外的缓冲。

我一直在寻找,但没有听到其他人支持这一说法。将 read() 调用到页面对齐的缓冲区(可能使用 mmap/posix_memalign 等分配)实际上更有效吗?如果它不是真的,它是否曾经是真的?它是否严重依赖于底层文件系统或其他类似因素?

谢谢!

c unix linux optimization posix

2
推荐指数
1
解决办法
1096
查看次数