小编alf*_*lfC的帖子

是x = std :: move(x)未定义?

我们x是某种类型的先前已初始化的变量.是以下行:

x = std::move(x)
Run Code Online (Sandbox Code Playgroud)

未定义?这个标准在哪里?它对它有什么看法?

c++ language-lawyer c++11 c++14

61
推荐指数
3
解决办法
2892
查看次数

Boost.Process在哪里?

我需要执行一个程序并在c ++中检索它的stdout输出.我希望我的代码也是跨平台的.

最近我发现了针对您所有跨平台需求的Boost c ++库的精彩世界,我想我会去boost.org并阅读Boost.Process的文档.令我惊讶的是,它不存在!然后我开始弄清楚Boost给他们的跨平台库启动外部进程的名称,但到目前为止还没有找到它.

谷歌搜索带我去了Julio M. Merino Vidal的Boost.Process,它似乎是我正在寻找的非官方Boost库.奇怪的是,我似乎无法在该网站上找到下载链接.似乎该项目最近没有任何进展.

我终于能够在外部网站上找到Vidal的Boost.Process的下载链接,并且现在将使用它,但是我非常惊讶于我需要付出的努力才能获得跨平台的c ++库.与外部流程互动.

那么,为什么没有正式的Boost.Process?这似乎是一个非常有价值的补充.或者我完全忽视了这里明显的解决方案?您是否可以建议其他跨平台库来管理外部流程的简单启动和交互?

c++ boost cross-platform platform-independent boost-process

56
推荐指数
4
解决办法
3万
查看次数

获得(-1)^ n的正确方法是什么?

许多算法需要计算(-1)^n(两者都是整数),通常作为一系列因子.也就是说,-1奇数n和偶数n 的因子1.在C++环境中,人们经常会看到:

#include<iostream>
#include<cmath>
int main(){
   int n = 13;
   std::cout << std::pow(-1, n) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

什么是更好或通常的惯例?(或者是其他东西),

std::pow(-1, n)
std::pow(-1, n%2)
(n%2?-1:1)
(1-2*(n%2))  // (gives incorrect value for negative n)
Run Code Online (Sandbox Code Playgroud)

编辑:

此外,用户@SeverinPappadeux提出了另一种基于(全局?)数组查找的替代方案.我的版本是:

const int res[] {-1, 1, -1}; // three elements are needed for negative modulo results
const int* const m1pow = res + 1; 
...
m1pow[n%2]
Run Code Online (Sandbox Code Playgroud)

这可能不会解决问题,但是,通过使用发出的代码,我们可以放弃一些选项.

首先没有优化,最终的竞争者是:

   1 - ((n & 1) << 1);
Run Code Online (Sandbox Code Playgroud)

(7操作,无内存访问)

  mov eax, DWORD PTR [rbp-20] …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm x86 cmath

52
推荐指数
3
解决办法
3931
查看次数

如何直接从内存中编译和执行?

是否可以编译C++(或类似)程序而不生成可执行文件但是将其写入并直接从内存执行?

例如,使用GCCclang,具有类似效果的东西:

c++ hello.cpp -o hello.x && ./hello.x $@ && rm -f hello.x
Run Code Online (Sandbox Code Playgroud)

在命令行中.

但是没有将可执行文件写入磁盘以立即加载/再次运行它的负担.

(如果可能,该过程可能不使用磁盘空间.)

c++ linux

44
推荐指数
4
解决办法
1万
查看次数

std :: move(*this)是一个好模式吗?

为了使这个代码与C++ 11引用限定符按预期工作,我必须引入一个std::move(*this)听起来不对的代码.

#include<iostream>
struct A{
    void gun() const&{std::cout << "gun const&" << std::endl;}
    void gun() &&{std::cout << "gun&&" << std::endl;}
    void fun() const&{gun();}
    void fun() &&{std::move(*this).gun();} // <-- is this correct? or is there a better option
};

int main(){
    A a; a.fun(); // prints gun const&
    A().fun(); // prints gun&&
}
Run Code Online (Sandbox Code Playgroud)

有些事情听起来不对劲.std::move必要吗?这是推荐使用吗?目前,如果我不使用它,我会遇到gun const&两种情况,这不是预期的结果.

(似乎*this总是隐式和左值引用,这是有道理的,但然后是逃避使用的唯一方法move)

clang 3.4和测试gcc 4.8.3.

编辑:这是我从@hvd回答中理解的:

1)std::move(*this)在语法和概念上是正确的

2)但是,如果 …

c++ this lvalue move-semantics c++11

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

boost :: tokenizer vs boost :: split

我试图将每个'^'字符上的c ++字符串解析为矢量标记.我一直使用boost :: split方法,但我现在正在编写性能关键代码,并想知道哪一个提供了更好的性能.

例如:

string message = "A^B^C^D";
vector<string> tokens;
boost::split(tokens, message, boost::is_any_of("^"));
Run Code Online (Sandbox Code Playgroud)

boost::char_separator<char> sep("^");
boost::tokenizer<boost::char_separator<char> > tokens(text, sep);
Run Code Online (Sandbox Code Playgroud)

哪一个会提供更好的性能?为什么?

c++ boost

29
推荐指数
2
解决办法
3万
查看次数

允许使用char*对T*进行别名化.是否也允许反过来?

注意:此问题已重命名并缩小,以使其更具针对性和可读性.大多数评论都涉及旧文本.


根据标准,不同类型的对象可能不共享相同的存储位置.所以这不合法:

std::array<short, 4> shorts;
int* i = reinterpret_cast<int*>(shorts.data()); // Not OK
Run Code Online (Sandbox Code Playgroud)

但是,该标准允许此规则的例外:可以通过指向char或的指针访问任何对象unsigned char:

int i = 0;
char * c = reinterpret_cast<char*>(&i); // OK
Run Code Online (Sandbox Code Playgroud)

但是,我不清楚这是否也允许反过来.例如:

char * c = read_socket(...);
unsigned * u = reinterpret_cast<unsigned*>(c); // huh?
Run Code Online (Sandbox Code Playgroud)

c++ strict-aliasing language-lawyer type-punning

27
推荐指数
2
解决办法
3024
查看次数

连续迭代器检测

C++ 17引入了ContiguousIterator的概念http://en.cppreference.com/w/cpp/iterator.然而,似乎没有计划contiguous_iterator_tag(通过我们现在以同样的方式random_access_iterator_tag)报告std::iterator_traits<It>::iterator_category.

为什么contiguous_iterator_tag失踪?

是否有传统的协议来确定迭代器是否是连续的?还是编译时间测试?

在过去我提到过,对于容器,如果有一个.data()成员转换为指向::value类型的指针,并且有.size()成员可转换为指针差异,那么应该假设容器是连续的,但我不能提取迭代器的类似特征.

一种解决方案可能是data为连续迭代器提供一个函数.

当然,连续概念&(it[n]) == (&(*it)) + n在所有情况下都有效n,但在编译时无法检查.


编辑:我发现这个视频把它放在更广泛的C++概念上下文中.CppCon 2016:"在现代多核世界中构建和扩展迭代器层次结构",作者:Patrick Niedzielski.解决方案使用概念(Lite),但最后的想法是连续的迭代器应该实现一个pointer_from函数(与我的data(...)函数相同).

结论是概念将有助于形式化理论,但它们并不神奇,在某种意义上,某个人会在某个地方定义新的特别命名的函数而不是连续的迭代器.这个讨论概括了分段迭代器(带有相应的函数segmentlocal),不幸的是它没有说明跨步指针.

c++ iterator iterator-traits c++17

27
推荐指数
1
解决办法
1826
查看次数

抽象代数与编程

我将开始学习抽象代数组,环等.我有兴趣了解任何编程语言,如果有的话可以帮助我学习/尝试我在理论上学到的概念.

编辑:我并不是在考虑实施我学到的东西.我有兴趣知道任何已经支持它们的语言.

computer-science wolfram-mathematica algebra

26
推荐指数
4
解决办法
1万
查看次数

是否可以重载一个可以从指针告诉固定数组的函数?

动机:

几乎是为了好玩,我试图编写一个函数重载,可以分辨参数是固定大小的数组还是指针.

double const  d[] = {1.,2.,3.};
double a;
double const* p = &a;
f(d); // call array version
f(p); // call pointer version
Run Code Online (Sandbox Code Playgroud)

我发现这特别困难,因为众所周知的事实是数组比指针更快地衰减到指针.一种天真的方法就是写作

void f(double const* c){...}
template<size_t N> void f(double const(&a)[N]){...}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用.因为在最好的情况下,编译器确定f(d)上面的数组调用是不明确的.

部分解决方案:

我尝试了很多东西,我能得到的最接近的是以下具体代码.另请注意,在此示例代码中我使用的是char代替double,但最后它非常相似.

首先,我必须使用SFINAE来禁用函数指针版本中的转换(从数组ref到ptr).其次,我不得不为所有可能的数组大小(手动)重载.

[可编码]

#include<type_traits> // for enable_if (use boost enable_if in C++98)
#include<iostream>
template<class Char, typename = typename std::enable_if<std::is_same<Char, char>::value>::type>
void f(Char const* dptr){std::cout << "ptr" << std::endl;} // preferred it seems

void f(char const (&darr)[0] ){std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ arrays pointers c++11

22
推荐指数
4
解决办法
3346
查看次数