我们x
是某种类型的先前已初始化的变量.是以下行:
x = std::move(x)
Run Code Online (Sandbox Code Playgroud)
未定义?这个标准在哪里?它对它有什么看法?
我需要执行一个程序并在c ++中检索它的stdout输出.我希望我的代码也是跨平台的.
最近我发现了针对您所有跨平台需求的Boost c ++库的精彩世界,我想我会去boost.org并阅读Boost.Process的文档.令我惊讶的是,它不存在!然后我开始弄清楚Boost给他们的跨平台库启动外部进程的名称,但到目前为止还没有找到它.
谷歌搜索带我去了Julio M. Merino Vidal的Boost.Process,它似乎是我正在寻找的非官方Boost库.奇怪的是,我似乎无法在该网站上找到下载链接.似乎该项目最近没有任何进展.
我终于能够在外部网站上找到Vidal的Boost.Process的下载链接,并且现在将使用它,但是我非常惊讶于我需要付出的努力才能获得跨平台的c ++库.与外部流程互动.
那么,为什么没有正式的Boost.Process?这似乎是一个非常有价值的补充.或者我完全忽视了这里明显的解决方案?您是否可以建议其他跨平台库来管理外部流程的简单启动和交互?
许多算法需要计算(-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++(或类似)程序而不生成可执行文件但是将其写入并直接从内存执行?
例如,使用GCC
和clang
,具有类似效果的东西:
c++ hello.cpp -o hello.x && ./hello.x $@ && rm -f hello.x
Run Code Online (Sandbox Code Playgroud)
在命令行中.
但是没有将可执行文件写入磁盘以立即加载/再次运行它的负担.
(如果可能,该过程可能不使用磁盘空间.)
为了使这个代码与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 ++字符串解析为矢量标记.我一直使用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)
哪一个会提供更好的性能?为什么?
注意:此问题已重命名并缩小,以使其更具针对性和可读性.大多数评论都涉及旧文本.
根据标准,不同类型的对象可能不共享相同的存储位置.所以这不合法:
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++ 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(...)
函数相同).
结论是概念将有助于形式化理论,但它们并不神奇,在某种意义上,某个人会在某个地方定义新的特别命名的函数而不是连续的迭代器.这个讨论概括了分段迭代器(带有相应的函数segment
和local
),不幸的是它没有说明跨步指针.
我将开始学习抽象代数组,环等.我有兴趣了解任何编程语言,如果有的话可以帮助我学习/尝试我在理论上学到的概念.
编辑:我并不是在考虑实施我学到的东西.我有兴趣知道任何已经支持它们的语言.
动机:
几乎是为了好玩,我试图编写一个函数重载,可以分辨参数是固定大小的数组还是指针.
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)