在C和C++中是否有一种方法可以使返回void的函数以未指定的顺序进行求值?
我知道函数参数是以未指定的顺序计算的,因此对于不返回void的函数,可以使用它来以未指定的顺序评估这些函数:
#include <stdio.h>
int hi(void) {
puts("hi");
return 0;
}
int bye(void) {
puts("bye");
return 0;
}
int moo(void) {
puts("moo");
return 0;
}
void dummy(int a, int b, int c) {}
int main(void) {
dummy(hi(), bye(), moo());
}
Run Code Online (Sandbox Code Playgroud)
由符合编译器编译合法的C和C++代码可以打印hi,bye和moo以任何顺序.这不是未定义的行为(鼻子恶魔不会有效),只有不止一个但不是无限的有效输出,并且兼容的编译器甚至不需要确定它产生什么.
没有虚拟返回值,有没有办法做到这一点?
澄清: 这是一个关于C和C++的抽象问题.一个更好的原始措辞可能是有任何上下文,其中函数评估顺序未指定返回void的函数?我不是想解决一个具体的问题.
-fprofile-use和之间有什么区别-fauto-profile?
以下是文档所说的内容:
https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options
-fprofile使用
-fprofile使用=路径
启用配置文件反馈导向的优化,以及通常只有可用的配置文件反馈才能获利的以下优化:[...]
如果指定了path,GCC将查看查找概要文件反馈数据文件的路径.见-fprofile-dir.
在那之下
-fauto瞩目
-fauto轮廓=路径
启用基于采样的反馈导向优化,以及通常仅通过可用的配置文件反馈获利的以下优化:[...]
path是包含AutoFDO配置文件信息的文件的名称.如果省略,则默认为当前目录中的fbdata.afdo.
([...]for 中的优化列表-fauto-profile更长.)
R似乎对错误处理采取了非常自由放任的立场,行为类似于大多数shell脚本语言.最重要的是,R倾向于在终端上打印大量无害的文本.这使得错误很容易被忽视.不止一次,我有一个脚本在早期产生错误,然后愉快地传播NaNs通过其余的计算.只有经过一段时间的奇怪结果后,我才意识到发生了什么.
经验丰富的R用户如何处理这个问题?有没有办法让错误致命或至少更明显?
从概念上讲,这个C代码可以被描述为创建一个与输入数组相同但是以1作为第一个元素的新数组:
int* retire_and_update(int* arr) {
arr[0] = 1;
return arr;
}
Run Code Online (Sandbox Code Playgroud)
这是一个纯函数(wink wink nudge nudge),只要不再对输入数组及其元素进行引用即可.C类型系统不会对我们强制执行,但它原则上似乎是可执行的.
gcc生成的代码简单而有效:
retire_and_update:
movq %rdi, %rax
movl $1, (%rdi)
ret
Run Code Online (Sandbox Code Playgroud)
我们的功能通过在恒定时间内创建一个全新的数组并且不使用额外的内存来实现看似不可能的功能.尼斯.可以使用类似代码有效地实现具有类似数组的输入和输出的Haskell函数吗?有没有办法表达"这是对这个变量的最后一个引用",以便纯函数可以在幕后蚕食变量?
如果函数被内联,那么在这里没有任何有趣的事情需要发生,所以让我们假设调用者和函数将被单独编译.
查看链接的问题.
接受的答案说明,
"取代malloc会打开一堆蠕虫.它可以完成,但不能移植,因为它需要知道链接器."
为什么替换malloc需要知道链接器以及为什么不替换:: operator new()?
Linux perf工具提供对CPU事件计数器的访问.它允许您指定要计数的事件以及何时计算这些事件.
https://perf.wiki.kernel.org/index.php/Tutorial
默认情况下,事件在用户和内核级别进行测量:
perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000要仅在用户级别进行测量,必须传递修饰符:
perf stat -e cycles:u dd if=/dev/zero of=/dev/null count=100000要测量用户和内核(显式):
perf stat -e cycles:uk dd if=/dev/zero of=/dev/null count=100000
由此,我预计这cycles:u意味着"只运行非内核代码时才计算事件",并且记录的计数不会映射到内核符号,但似乎并非如此.
这是一个例子:
perf record -e cycles:u du -sh ~
[...]
perf report --stdio -i perf.data
[...]
9.24% du [kernel.kallsyms] [k] system_call
[...]
0.70% du [kernel.kallsyms] [k] page_fault
[...]
Run Code Online (Sandbox Code Playgroud)
如果我这样做但使用cycles:uk然后我会报告更多的内核符号,所以事件修饰符确实有效.使用cycles:k几乎只有内核符号生成报告,但它确实包含一些libc符号.
这里发生了什么?这是预期的行为吗?我是否误解了链接文档中使用的语言?
链接文档还包括此表,如果有帮助,则使用略有不同的描述:
Run Code Online (Sandbox Code Playgroud)Modifiers | Description | Example ----------+--------------------------------------+---------- u | monitor at priv level 3, …
asio 的作者 Christopher Kohlhoff 正在为 C++ 中的执行程序开发一个库和提案。到目前为止,他的工作包括这个repo和docs。不幸的是,基本原理部分尚未编写。到目前为止,文档给出了一些图书馆功能的例子,但我不觉得我遗漏了什么。不知何故,这不仅仅是一系列花哨的调用函数。
我在 Google 上可以找到的所有内容都非常特定于 Java,而且很多都是特定于特定框架的,所以我很难弄清楚这个“执行程序模式”是什么。
在这种情况下,执行者是什么?他们在做什么?什么时候它们会有所帮助的规范示例是什么?执行者之间存在哪些差异?执行者的替代方案是什么?它们如何比较?特别是,似乎与事件循环有很多重叠,其中事件是初始输入事件、执行事件和关闭事件。
当试图找出新的抽象概念时,我通常会发现理解动机的关键。那么对于执行者来说,我们试图抽象什么?为什么?我们试图使什么成为泛型?如果没有执行者,我们还需要做什么额外的工作?
我想知道是否有可能在Linux上的用户空间中的单个进程中实现本机代码的抢占式多任务处理.(也就是说,从外部暂停一些正在运行的本机代码,保存上下文,在不同的上下文中交换,以及恢复执行,所有这些都由用户空间协调,但使用可能进入内核的调用.)我以为这可以使用信号来完成处理器SIGALRM和*context()家庭,但事实证明,整个*context()家庭是异步信号不安全的,所以不能保证方法的工作.我确实发现了一个实现这个想法的要点,所以显然它确实在Linux上运行,至少有时候,即使POSIX也不需要工作.gist将其作为信号处理程序安装SIGALRM,进行多次*context()调用:
void
timer_interrupt(int j, siginfo_t *si, void *old_context)
{
/* Create new scheduler context */
getcontext(&signal_context);
signal_context.uc_stack.ss_sp = signal_stack;
signal_context.uc_stack.ss_size = STACKSIZE;
signal_context.uc_stack.ss_flags = 0;
sigemptyset(&signal_context.uc_sigmask);
makecontext(&signal_context, scheduler, 1);
/* save running thread, jump to scheduler */
swapcontext(cur_context,&signal_context);
}
Run Code Online (Sandbox Code Playgroud)
Linux是否提供使这种方法正确的保证?有没有办法使这个正确吗?是否有完全不同的方法正确地做到这一点?
(通过"在用户空间中实现"我并不是说我们永远不会进入内核.我的意思是与内核实现的抢先式多任务进行对比.)
为什么std :: stof,std :: stod,std :: stold抛出异常的原因是什么?
http://en.cppreference.com/w/cpp/string/basic_string/stof
输入错误是一个常用的例子,当通过异常进行错误处理不合适时(通常用"异常情况"的古怪循环推理表达,但仍然是一个很好的例子).并不是说其他错误处理机制在C++标准库中以某种方式被禁止.例如,另一个C++ 11新手,该std::unordered_map::insert系列,表示在std::pair<iterator,bool>返回类型中使用第二个元素失败.std::unordered_map::insert函数内部的失败似乎比输入错误更"特殊".在不尝试插入的情况下,可以保证插入成功但不解析它就不可能保证解析成功.
我只是想知道当这些功能被接纳到标准中时的基本原理.希望它可以在某个地方发布,或者委员会成员可以匆匆而过,并对此有所了解.我不是要求就异常与其他机制的优缺点进行全面论述.