我发现了这个有趣且功能强大的工具IACA(英特尔架构代码分析器),但我无法理解它.我能用它做什么,它的局限性是什么?我该怎么做:
ISO C要求托管实现调用名为的函数main.如果程序接收到参数,它们将作为char*指针数组接收,这是main定义中的第二个参数int main(int argc, char* argv[]).
ISO C还要求argv数组指向的字符串是可修改的.
但argv别名的元素可以相互影响吗?换句话说,可以存在i,j使得
0 >= i && i < argc0 >= j && j < argci != j0 < strlen(argv[i])strlen(argv[i]) <= strlen(argv[j])argv[i] 别名 argv[j]在计划启动?如果是这样,argv[i][0]也可以通过别名字符串看到写入argv[j].
ISO C标准的相关条款如下,但不允许我最终回答这个名义上的问题.
§5.1.2.2.1程序启动
在程序启动时调用的函数被命名
main.该实现声明此函数没有原型.它应定义为返回类型int且没有参数:Run Code Online (Sandbox Code Playgroud)int main(void) { /* ... */ }或者有两个参数(这里称为
argc和argv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称):Run Code Online (Sandbox Code Playgroud)int main(int argc, char …
当处理某些数据流(例如,来自网络的请求)时,使用一些临时存储器是很常见的.例如,URL可以分成多个字符串,每个字符串可能从堆中分配内存.这些实体的使用通常是短暂的,并且内存总量通常相对较小,应该适合CPU缓存.
在用于临时字符串的内存被释放时,字符串内容很可能只存在于缓存中.但是,CPU并不知道要释放的内存:释放只是内存管理系统中的更新.结果,当CPU高速缓存用于其他存储器时,CPU可能最终不必要地将未使用的内容写入实际存储器 - 除非存储器释放以某种方式向CPU指示存储器不再被使用.因此,问题变为:
释放内存的内存管理功能是否表示可以丢弃相应内存的内容?有没有办法向CPU指示不再使用内存?(至少,对于某些CPU:显然,架构之间可能存在差异)由于不同的实现可能会在质量上有所不同,可能会或可能不会做任何花哨的事情,问题实际上是否有任何内存管理实现将内存指示为未使用?
我确实意识到始终使用相同的内存领域可能是一种缓解策略,以避免对实际内存的不必要写入.在这种情况下,将使用相同的缓存内存.类似地,内存分配可能总是产生相同的内存,也避免了不必要的内存传输.但是,我可能不需要依赖任何适用的技术.
memory performance memory-management dynamic-memory-allocation cpu-cache
关于此主题有一些问题,但没有一个是真正的答案。问题是:如何测量macOS上的L1,L2,L3(如果有)缓存未命中?
问题在于,即使没有任何外部工具,macOS在理论上也不会提供这些值。在乐器中,我们可以使用计数器并转到录音选项...,如下所示:
但是,不存在L1高速缓存未命中或L2高速缓存,但是可以选择的可能项目数量庞大:
因此,在测量L1和L2 高速缓存未命中率(或L3,如果有的话)时,如何计算它们?
为了检索该神奇的“缓存未命中”数字,我应该注意哪个列表“ 缓存未命中”?
performance x86 caching performancecounter xcode-instruments
C11和C++ 11都支持源文件中的扩展字符,以及通用字符名称(UCN),它们允许用户只输入字符而不是基本源字符集中的字符.
C++ 11还定义了编译的几个翻译阶段.特别是,扩展字符在翻译的第一阶段被归一化为UCN,如下所述:
§C++ 11 2.2p1.1:
如果需要,物理源文件字符以实现定义的方式映射到基本源字符集(引入行尾指示符的换行符).接受的物理源文件字符集是实现定义的.Trigraph序列(2.4)由相应的单字符内部表示代替.不在基本源字符集(2.3)中的任何源文件字符将替换为指定该字符的通用字符名称.(实现可以使用任何内部编码,只要在源文件中遇到实际扩展字符,并且在源文件中表示为与通用字符名称相同的扩展字符(即,使用\ uXXXX表示法),处理等效,除非在原始字符串文字中还原此替换.)
因此,我的问题是:
是否符合标准的程序汇编
Run Code Online (Sandbox Code Playgroud)#include <stdio.h> int main(void){ printf("\é\n"); printf("\\u00e9\n"); return 0; }失败,编译和打印
Run Code Online (Sandbox Code Playgroud)é é或编译和打印
Run Code Online (Sandbox Code Playgroud)\u00e9 \u00e9,什么时候跑?
我的论点是答案是它成功编译和打印\u00e9,因为根据上面的§2.2p1.1,我们有
实现可以使用任何内部编码,只要在源文件中遇到实际的扩展字符,并且在源文件中表示为与通用字符名称相同的扩展字符(即,使用\ uXXXX表示法),等效,除非在原始字符串文字中还原此替换.,我们不是原始的字符串文字.
然后是这样的
printf("\é\n");映射到printf("\\u00e9\n");."\\u00e9\n"为1.\\映射到\,并且片段u00e9不被识别为UCN,因此按原样打印.不幸的是,现存的编译器不同意我的意见.我用GCC 4.8.2和Clang 3.5进行了测试,这是他们给我的:
GCC 4.8.2
$ g++ -std=c++11 -Wall -Wextra ucn.cpp -o ucn
ucn.cpp: …Run Code Online (Sandbox Code Playgroud)我需要一些基于LBP的人脸检测的帮助,这就是我写这个的原因.
我在OpenCV上实现了与面部检测相关的以下问题:
LBP_frontal_face_classifier.xml中的功能值是什么?我知道它们是4个整数的向量.但是我该如何使用这个功能呢?我认为第0阶段访问第一个功能但访问不在此模式中.这个功能的访问模式是什么?
文献中的所有论文仅提供高级概述.它们的描述主要包括邻域像素的LBP计算.但是这个LBP值如何用于分类器中的那些元素?
我读了一些文章,文章.但没有一个清楚地描述基于LBP的人脸检测是如何工作的或详细的算法.如果有人想要自己开发一个人脸检测程序,他应该遵循的步骤是什么 - 没有文件描述.
如果可以,请帮助我.我会很感激.
使用的编译器:gcc 8.2
命令行:-Wall
我目前对序列点违规的理解是代码在某种程度上取决于给定表达式中操作数/子表达式的求值顺序。之所以如此,是因为表达式中操作数的求值顺序未指定,如此处所述。因此,代码如下:
a = 5;
b = a + ++a;
Run Code Online (Sandbox Code Playgroud)
是一种违规并被-Wsequence-point捕获,因为结果存在歧义,即应该是 (5 + 6) 还是 (6 + 6) ?我认为下面的代码中存在类似的歧义,因为我们无法知道第二个 ++a 是否会在第一个之前被评估:
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
int use()
{
int min;
int a = 4, b = 5;
min = MIN(++a, b);
//min = ((++a) < b) ? (++a) : b;
return min;
}
Run Code Online (Sandbox Code Playgroud)
我显然错过了一些东西,因为这段代码没有在-Wseqeuence-point上警告我。有人可以帮我理解什么吗?请注意,我特意按原样定义了 MIN。