小编Iwi*_*ist的帖子

什么是IACA以及如何使用它?

我发现了这个有趣且功能强大的工具IACA(英特尔架构代码分析器),但我无法理解它.我能用它做什么,它的局限性是什么?我该怎么做:

  • 用它来分析C或C++中的代码?
  • 用它来分析x86汇编程序中的代码?

c c++ performance assembly iaca

54
推荐指数
1
解决办法
7985
查看次数

ISO C是否允许提供给main()的argv []指针的别名?

ISO C要求托管实现调用名为的函数main.如果程序接收到参数,它们将作为char*指针数组接收,这是main定义中的第二个参数int main(int argc, char* argv[]).

ISO C还要求argv数组指向的字符串是可修改的.

argv别名的元素可以相互影响吗?换句话说,可以存在i,j使得

  • 0 >= i && i < argc
  • 0 >= j && j < argc
  • i != j
  • 0 < 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且没有参数:

int main(void) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

或者有两个参数(这里称为argcargv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称):

int main(int argc, char …
Run Code Online (Sandbox Code Playgroud)

c alias parameter-passing language-lawyer c11

17
推荐指数
2
解决办法
523
查看次数

内存分配功能是否表示不再使用内存内容?

当处理某些数据流(例如,来自网络的请求)时,使用一些临时存储器是很常见的.例如,URL可以分成多个字符串,每个字符串可能从堆中分配内存.这些实体的使用通常是短暂的,并且内存总量通常相对较小,应该适合CPU缓存.

在用于临时字符串的内存被释放时,字符串内容很可能只存在于缓存中.但是,CPU并不知道要释放的内存:释放只是内存管理系统中的更新.结果,当CPU高速缓存用于其他存储器时,CPU可能最终不必要地将未使用的内容写入实际存储器 - 除非存储器释放以某种方式向CPU指示存储器不再被使用.因此,问题变为:

释放内存的内存管理功能是否表示可以丢弃相应内存的内容?有没有办法向CPU指示不再使用内存?(至少,对于某些CPU:显然,架构之间可能存在差异)由于不同的实现可能会在质量上有所不同,可能会或可能不会做任何花哨的事情,问题实际上是否有任何内存管理实现将内存指示为未使用?

我确实意识到始终使用相同的内存领域可能是一种缓解策略,以避免对实际内存的不必要写入.在这种情况下,将使用相同的缓存内存.类似地,内存分配可能总是产生相同的内存,也避免了不必要的内存传输.但是,我可能不需要依赖任何适用的技术.

memory performance memory-management dynamic-memory-allocation cpu-cache

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

macOS上的缓存未命中

关于此主题有一些问题,但没有一个是真正的答案。问题是:如何测量macOS上的L1,L2,L3(如果有)缓存未命中

问题在于,即使没有任何外部工具,macOS在理论上也不会提供这些值。在乐器中,我们可以使用计数器并转到录音选项...,如下所示:

柜台

但是,不存在L1高速缓存未命中或L2高速缓存,但是可以选择的可能项目数量庞大

大事记

因此,在测量L1和L2 高速缓存未命中率(或L3,如果有的话)时,如何计算它们?

为了检索该神奇的“缓存未命中”数字,我应该注意哪个列表“ 缓存未命中”?

performance x86 caching performancecounter xcode-instruments

9
推荐指数
1
解决办法
927
查看次数

C11和C++ 11 Exended和Universal Character Escaping

上下文

C11和C++ 11都支持源文件中的扩展字符,以及通用字符名称(UCN),它们允许用户只输入字符而不是基本源字符集中的字符.

C++ 11还定义了编译的几个翻译阶段.特别是,扩展字符在翻译的第一阶段被归一化为UCN,如下所述:

§C++ 11 2.2p1.1:

如果需要,物理源文件字符以实现定义的方式映射到基本源字符集(引入行尾指示符的换行符).接受的物理源文件字符集是实现定义的.Trigraph序列(2.4)由相应的单字符内部表示代替.不在基本源字符集(2.3)中的任何源文件字符将替换为指定该字符的通用字符名称.(实现可以使用任何内部编码,只要在源文件中遇到实际扩展字符,并且在源文件中表示为与通用字符名称相同的扩展字符(即,使用\ uXXXX表示法),处理等效,除非在原始字符串文字中还原此替换.)


因此,我的问题是:

是否符合标准的程序汇编

#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
Run Code Online (Sandbox Code Playgroud)

,什么时候跑?


知情的个人意见

我的论点是答案是它成功编译和打印\u00e9,因为根据上面的§2.2p1.1,我们有

实现可以使用任何内部编码,只要在源文件中遇到实际的扩展字符,并且在源文件中表示为与通用字符名称相同的扩展字符(即,使用\ uXXXX表示法),等效,除非在原始字符串文字中还原此替换.,我们不是原始的字符串文字.

然后是这样的

  • 在阶段1中,printf("\é\n");映射到printf("\\u00e9\n");.
  • 在阶段3中,源文件被分解为预处理令牌(§2.2p1.3),其中string-literal "\\u00e9\n"为1.
  • 在阶段5中,字符文字或字符串文字中的每个源字符集成员,以及字符文字或非原始字符串文字中的每个转义序列和通用字符名称,都将转换为相应的成员.执行字符集(§2.2p1.5).因此,通过最大蒙克原理,\\映射到\,并且片段u00e9不被识别为UCN,因此按原样打印.

实验

不幸的是,现存的编译器不同意我的意见.我用GCC 4.8.2和Clang 3.5进行了测试,这是他们给我的:

c c++ language-lawyer c++11 c11

8
推荐指数
1
解决办法
651
查看次数

了解OpenCV LBP实现

我需要一些基于LBP的人脸检测的帮助,这就是我写这个的原因.

我在OpenCV上实现了与面部检测相关的以下问题:

  1. 在lbpCascade_frontal_face.xml(这是来自opencv):什么是internalNodes,leafValues,树,功能等?我知道它们用在算法中.但我不明白他们每个人的意思.例如,为什么我们在特定阶段采用特定功能而不采用其他功能?我们如何决定选择哪个功能/节点?
  2. LBP_frontal_face_classifier.xml中的功能值是什么?我知道它们是4个整数的向量.但是我该如何使用这个功能呢?我认为第0阶段访问第一个功能但访问不在此模式中.这个功能的访问模式是什么?

  3. 文献中的所有论文仅提供高级概述.它们的描述主要包括邻域像素的LBP计算.但是这个LBP值如何用于分类器中的那些元素?

  4. 积分图像如何帮助计算像素的LBP值?我知道如何使用HAAR.我需要了解LBP.

我读了一些文章,文章.但没有一个清楚地描述基于LBP的人脸检测是如何工作的或详细的算法.如果有人想要自己开发一个人脸检测程序,他应该遵循的步骤是什么 - 没有文件描述.

如果可以,请帮助我.我会很感激.

algorithm opencv face-detection lbph-algorithm

7
推荐指数
1
解决办法
5815
查看次数

为什么此代码中没有违反序列点规则的情况?

使用的编译器: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。

c compiler-warnings sequence-points

0
推荐指数
1
解决办法
199
查看次数