我正在与其他团队成员一起在C中开发一个大型项目,我们对如何处理"这种情况永远不会发生"的错误方式存在分歧.我的意思是代码当前永远无法达到的错误情况,但有人可以修改代码,修改后可能会出现错误情况.
例如,假设我有一个函数,在成功时返回0,如果给出NULL参数则返回-EINVAL.我自然会做的是:
int err;
struct myctx ctx;
err = callFunction(&ctx);
if (err != 0)
{
abort();
}
Run Code Online (Sandbox Code Playgroud)
甚至:
int err;
struct myctx ctx;
err = callFunction(&ctx);
if (err == -EINVAL)
{
abort();
}
else if (err != 0)
{
abort();
}
Run Code Online (Sandbox Code Playgroud)
...区分-EINVAL和未知错误代码这两种情况.
这种错误处理方法的好处是编程简单(几行代码)并留下可用于快速调试情况的核心文件.
但是,一些团队成员不同意这种错误处理方法,因为我正在做一个不干净的退出,而代码当前永远不会到达abort()行,有可能在将来有人修改代码并且它到达abort()然后行.据他们说,我应该尝试做一个受控退出并将原因打印给用户.所以,我想我应该做的不是:
int err;
struct myctx ctx;
err = callFunction(&ctx);
if (err == -EINVAL)
{
fprintf(stderr, "Argument was NULL in file %s line %d\n", __FILE__, __LINE__);
exit(1);
}
else if (err != 0)
{
fprintf(stderr, "Error was %d …Run Code Online (Sandbox Code Playgroud) 我开发了一个多线程程序,它取决于stdatomic.h中atomic_int,atomic_store和atomic_load的可用性.该计划由GCC编制.
现在,我试图在几个缺少stdatomic.h的旧操作系统版本上编译程序失败.不幸的是,我需要能够在旧机器上编译程序.因此,我在新的操作系统版本上编译程序并在旧版本上运行二进制文件是不够的.
有没有办法在旧机器上模拟stdatomic.h,也许有一些特定于GCC的内置函数?
虽然在旧的操作系统上安装较新版本的GCC可能是解决方案,但是当前的构建系统已经硬编码到其上的"gcc",并且新的GCC必须从源代码编译,因为旧操作系统不应该在包管理系统中有它.因此,理想情况下,答案将适用于旧的GCC版本.
考虑以下C代码:
int arr[2] = {0, 0};
int *ptr = (int*)&arr;
ptr[0] = 5;
printf("%d\n", arr[0]);
Run Code Online (Sandbox Code Playgroud)
现在,很明显代码打印5在常见的编译器上.但是,有人可以找到C标准中的相关部分,指出代码实际上有效吗?或者是代码未定义的行为?
我基本上要问的是,为什么&arr在投入时void *与arr投入时相同void *?因为我相信代码相当于:
int arr[2] = {0, 0};
int *ptr = (int*)(void*)&arr;
ptr[0] = 5;
printf("%d\n", arr[0]);
Run Code Online (Sandbox Code Playgroud)
我在这里思考这个问题时发明了这个例子:数组的指针到数组的重叠 ......但这显然是一个独特的问题.
我一直在使用netmap估计最近宣布的英特尔错误对我的数据包处理应用程序的影响。到目前为止,我测量到每个poll()系统调用处理大约 50 个数据包,但这个数字不包括gettimeofday()调用。我还测量到每秒可以从不存在的文件描述符中读取 1650 万次(这大约是系统调用可以执行的最便宜的操作)。我的数据包处理速率是每秒176万个数据包,或者就系统调用而言,每秒0.352万个系统调用。这意味着如果系统调用惩罚加倍,性能将降低 0.0352 / 16.5 = 0.21333%,这几乎是我不应该担心的事情。
但是,我的应用程序可能gettimeofday()经常使用系统调用。我的理解是,这些不是真正的系统调用,而是作为虚拟系统调用实现的,如什么是 vdso 和 vsyscall?。
现在,我的问题是,对最近宣布的 Intel bug 的修复(也可能影响 ARM,但可能不会影响 AMD)是否会减慢gettimeofday()系统调用速度?或者是gettimeofday()由于作为不同类型的虚拟系统调用而实现的完全不同的动物?
我有一个结构向量,为此我重载了所有比较运算符。我不知道编译时结构的大小。
检索向量中 n 个最佳(其中“最佳”可以是最小或最大)元素的快速方法是什么?我知道 max_element 和 min_element 但它们只返回一个元素。我宁愿不循环 n 次,检索最佳元素,将其删除,然后获取下一个。这种方法似乎太慢了。
谢谢。