小编Ste*_*ven的帖子

这个宏如何检测对齐问题?

我正在跟踪一些关于以下实现的源代码strlen

#include <_ansi.h>
#include <string.h>
#include <limits.h>

#define LBLOCKSIZE   (sizeof (long))
#define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1))

#if LONG_MAX == 2147483647L
#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080)
#else
#if LONG_MAX == 9223372036854775807L
/* Nonzero if X (a long int) contains a NULL byte. */
#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080)
#else
#error long int is not a 32bit or 64bit type.
#endif
#endif

#ifndef DETECTNULL
#error long int is not a …
Run Code Online (Sandbox Code Playgroud)

c

6
推荐指数
1
解决办法
115
查看次数

如何将 perf 与 ld_preload 一起使用?

我尝试使用perf statwithLD_PRELOAD作为可执行文件的前缀,例如:

perf stat LD_PRELOAD=$PWD/../user/preload.so ./write 1
Run Code Online (Sandbox Code Playgroud)

似乎对 perf 不起作用,有什么办法可以实现吗?

environment-variables ld-preload perf

6
推荐指数
1
解决办法
674
查看次数

变量属性SEC是什么意思?

目前,我正在跟踪 bpf 程序并发现一些我无法理解的内容。

有几个声明,例如:

struct bpf_map_def SEC("maps") map_parsing_context = {
...
};
struct {
...
} map_keys SEC(".maps");
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 这个语法叫什么?
  2. 这与 相同吗__attribute__((section("name")))
  3. map和之间有什么不同.map?它们只是用户定义的部分吗?

c bpf ebpf

5
推荐指数
1
解决办法
3339
查看次数

为什么更长的管线会使单个延迟时隙不足?

我在Patterson&Hennessy的《计算机组织和设计》教科书中阅读了以下声明:

随着处理器同时进入较长的流水线并在每个时钟周期发出多条指令,分支延迟变得更长,并且单个延迟时隙不足。

我可以理解为什么“每个时钟周期发出多个指令”会使单个延迟槽不足,但是我不知道为什么“较长的流水线”会引起延迟。

另外,我不明白为什么更长的管道会导致分支延迟变得更长。即使使用更长的流水线(完成一条指令的步骤),也不能保证周期会增加,为什么分支延迟会增加?

cpu-architecture

3
推荐指数
1
解决办法
48
查看次数

ARM 汇编中的点(两个关键字之间)意味着什么?

我看到了这样的集会:

b.gt memzero
Run Code Online (Sandbox Code Playgroud)

我想我知道 的含义b.gt,但不确定为什么语法是合法的。通过开发人员指南,我还没有看到任何这样的语法。

有没有规范这种语法的文档?或者我该如何称呼它?

assembly arm64

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

如何让我的编译器更愚蠢(错误的索引)?

我遇到了一个可怕的情况.我通常使用可视代码编辑我的代码,也可以在其中编译和执行(F5).但我发现vscode太聪明或者忽略了一些警告信息.并输出正确的答案,这在Ideone中也可以正常工作.但是在窗口cmd或dev C++中,我的代码无法输出任何内容,只返回一个大数字.

我发现上面提到的事情会发生一些情况.

像这样的代码

for (i = 0; i < g.size(); i++)
{
    int source;
    int dest;
    int minWeight = 999;

    for (j = 0; i < g[j].size(); j++)
    {
        // no edge, come to next condition
        if (!g[i][j])
            continue;
        if (g[i][j] < minWeight)
        {
            source = i;
            dest = j;
            minWeight = g[i][j];
        }
    }
    if
        updateGroup(index, index[source], index[dest]);
    else
        updateGroup(index, index[source], index[dest]);
}
Run Code Online (Sandbox Code Playgroud)

您可能会发现第二个for循环有错误的条件语句,它应该更改 j = 0; i < g[j].size(); j++j = 0; j < …

c++ c++11

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