小编fuz*_*fuz的帖子

如何定义描述内存位置的宏?

变量位于内存地址0x10000处.如何定义一个宏,以便写入该宏写入该内存位置?

c macros

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

计算算术平均值时,哪种求和方式更精确?

给定计算n IEEE 754双精度浮点数x 0,x 1,...,x n - 1的算术平均值的任务,是否更精确

(ksum i x i)/ n

(即首先进行所有x i的Kahan和,然后除以n)或

ksum i(x i/n)

(即首先将x i除以n然后进行Kahan求和)?

我自己的测试(在[0,1)中均匀分布的随机数和在0以σ= 1为中心的整个浮点数范围内的正态分布数字)是不确定的,表明两者都非常精确,但我选择的测试数据可能特别差.

floating-point precision average mean ieee-754

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

如何在保持一个值不变的情况下翻转SSE中的范围?

我有一个8位无符号8位数的向量,范围为0 .. 12 in xmm0.我想对e向量中的每个元素执行以下转换:

if (e != 12)
    e = 11 - e;
Run Code Online (Sandbox Code Playgroud)

也就是说,数字0,1,...,11被改变为11,10,...,0而12保持不变.其他值不会发生,我不在乎它们会发生什么.

如何使用SSE4指令集有效地实现此操作?

x86 assembly sse x86-64 vectorization

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

寻找预处理器命令来删除代码中的命令

我正在研究一个有时使用的C库

 static inline void myfunc(...)
Run Code Online (Sandbox Code Playgroud)

在定义函数时.

现在我尝试将其移植到不支持"静态内联"的旧C编译器.这是bcc - Bruce的C编译器.

我可以在替换的头文件中使用命令吗?

static inline void
Run Code Online (Sandbox Code Playgroud)

void
Run Code Online (Sandbox Code Playgroud)

在包含此头文件的所有程序中?

c c-preprocessor bcc-compiler

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

在 x86 平台中使用 -mcmodel=kernel 标志

我正在尝试将为 x86 架构构建的设备驱动程序交叉编译到 ARM 平台。它的编译没有任何错误,但我认为所有功能都不可用。所以我检查了 makefile 并找到了这个特定的部分。

ifeq ($(ARCH),x86_64)
    EXTRA_CFLAGS += -mcmodel=kernel -mno-red-zone
Run Code Online (Sandbox Code Playgroud)

这似乎是唯一依赖于架构的部分。在google上一段时间后,我发现 -mcmodel=kernel 用于内核代码模型,而 -mno-red-zone 是为了避免在内存中使用红色区域,并且它们都适用于 x86_64。但我不清楚,将 cmodel 设置为内核会产生什么影响?

(任何对arm问题的深入了解也将不胜感激。)

c gcc makefile x86-64 red-zone

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

在 FreeBSD 代码库上工作的推荐工作流程和环境是什么?

我想开发 FreeBSD 发行版的新功能或更改和现有程序,特别是用户空间¹。为此,我需要对 FreeBSD 代码库进行更改,然后编译和测试它们。²

在树上这样做/usr/src并在系统上安装结果似乎是一个坏主意,因为它需要您在 CURRENT 上运行您的开发机器,以 root 权限进行开发,并且如果您犯了错误,则软管您的系统。我想一定有更好的方法,并且可能是 FreeBSD 开发人员使用的标准设置。³

开发 FreeBSD 代码库的推荐工作流程是什么?


¹ 所以特定于内核开发的注意事项并不是非常重要

² 我熟悉开发后提交更改的流程

³ 我之前已经阅读了关于构建源代码开发手册和 FreeBSD 手册章节,但似乎都没有推荐特定的过程。

workflow development-environment freebsd tooling

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

为什么 mod 2^n 对有符号数使用 CLTD 指令

所以我知道当您执行x mod 2^n无符号操作时,编译器会简单地将操作转换为x & (2^n - 1).

但是当我使用有符号数字查看编译器实现时,例如

int signed_rem8(int x) { return x %8; }
Run Code Online (Sandbox Code Playgroud)

我得到这样的东西(https://godbolt.org/z/xY3Ef6WEc):

 movl    -4(%rbp), %eax
 cltd
 shrl    $29, %edx
 addl    %edx, %eax
 andl    $7, %eax
 subl    %edx, %eax
Run Code Online (Sandbox Code Playgroud)

这背后的逻辑是什么?

c optimization x86 assembly compiler-optimization

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

C++:在char*中将大型二进制文件(2GB到4GB)保存到RAM中?

我正在使用C++ 文件传输程序,它将文件转换为二进制文件,将字节保存在char*中,然后通过TCP连接将该char*发送到另一台计算机.然后另一台计算机在本地重新创建该文件.该程序确实有效,但我遇到了大文件的大问题!我无法分配足够的数组索引来包含字节!例如,如果我想发送一个600MB的文件,我需要一个带有600万个索引的char*.这有效.但是一旦我走得更高,程序根本无法分配内存而我会收到错误.

我的一个朋友建议我将文件分成块并按块执行传输块,但这会产生大量其他挑战,并且需要我基本上重写整个程序.

有没有办法解决这个问题?

c++ ftp file-io tcp

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

C程序如何在引擎盖下传递参数?

这是PDP-11代码混合C和汇编.在下面,u.u_rsav是一个数组指针,

savu(u.u_rsav);

该函数的汇编代码是

_savu:        bis     $340,PS
              mov     (sp)+,r1
              mov     (sp),r0
              mov     sp,(r0)+
              mov     r5,(r0)+
              bic     $340,PS
              jmp     (r1)
Run Code Online (Sandbox Code Playgroud)

看起来在进入程序之前,它首先推送参数,然后推送返回点PC值.因此,r1存储PC,r0存储参数.我的谜题是sp(堆栈指针)在汇编代码跳回调用点之前不会恢复到原始值.它仍然指向参数存储在堆栈中的位置.

c assembly stack compilation pdp-11

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

如何释放C中的调用堆栈?

我创建了一个使用 RDP(递归下降解析器)的计算器来解析和评估数学表达式“例如:5 cos(30) -5 (3+5)”。问题是我还尝试包含像“config”这样的命令,它可以让用户配置角度单位(Gra、Rad、Deg)。而这里我发现了代码设计的问题。

调用堆栈的简化示例:

int main()
{
   parseexpr()
    {
       parseterm()
       {
          parsefactor()
          {
              parsecommand() or parsefct() or parsenumber();
          }

       }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在当用户输入“config”命令时。我想让他配置计算器(配置位于 .txt 文件内),然后跳回“main()”(他会被要求再次输入表达式),因为通过调用返回会出现问题堆栈,因为我需要一个返回值,而“parsecommand()”无法返回。

我的问题是如何清理调用堆栈,以便我可以通过“goto”语句直接返回到 main ?

c stack callstack goto setjmp

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