小编jxh*_*jxh的帖子

游戏可以被视为实时系统吗?

我一直在阅读实时系统以及它们如何工作等等.我正在查看维基百科的文章,其中说每次移动带有计时器的国际象棋游戏可以被认为是实时系统,因为程序必须计算那个时候的举动.其他游戏怎么样?我们知道,游戏通常会尝试以25+ FPS运行,它是否可以被视为软实时系统,因为如果它低于25(我使用25作为预定义的阈值btw)它不是结束世界,只是我们想要的表现?

此外 - 游戏还有他们必须处理的事件.用户使用键盘/鼠标,并且系统必须在(再次)预定时间内相应地回答那些事件,然后才认为游戏"失败".

哦,我现在正在谈论单人游戏,以保持简单.

这听起来像游戏符合软实时系统标准,但我想知道我是否遗漏了任何东西......谢谢.

architecture real-time soft-real-time

7
推荐指数
2
解决办法
2053
查看次数

C11中附件K的支持是否符合实施要求?

回答使用我认为不是标准C 的某些功能(sscanf_ssprintf_s)的问题时,Daniel Fischer提请我注意所涉及的功能在附件K中定义.

我一般都明白,规范意味着它有助于定义标准.但是,C标准的附件传统上仅被视为信息性的.附件K在C11标准中标注为规范性的.它定义了"安全"功能.

这是否意味着没有提供这些功能的编译器不符合C11标准?

我只能获得C11标准草案,但它指出附件K是规范性的,但标准的库部分没有提到附件K中讨论的功能.运行时约束定义中的注释似乎意味着附件K定义了一个扩展.

规范性附件是否仅定义了可选的扩展?

c tr24731 language-lawyer c11

7
推荐指数
2
解决办法
1867
查看次数

为什么 big-Oh 并不总是算法的最坏情况分析?

我正在尝试学习算法分析,但我陷入了asymptotic notation(大O...)和cases(最佳、最差和平均)之间的关系。

我了解到该Big O符号定义了算法的上限,即它定义函数的增长不能超过其上限。

起初,我觉得它计算的是最坏的情况。我谷歌了一下(为什么最坏的情况不是大O?)并得到了大量的答案,这些答案对于初学者来说并不那么容易理解。

我的结论如下: Big O并不总是用来表示算法的最坏情况分析,因为,假设一个算法对最佳、平均和最差输入采取 O(n) 执行步骤,那么它的最佳、平均和最坏情况可以表示为 O (n)。

请告诉我我是否正确或者我遗漏了什么,因为我没有人来验证我的理解。请提出一个更好的例子来理解为什么Big O并不总是如此worst case

algorithm complexity-theory time-complexity data-structures

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

指针数学获取数组的长度

我不相信这是重复的(见下文)。


我发现这个问题几乎是一个精确的重复,但是我认为答案无法分析漏洞。请参阅:*((*(&array + 1))-1)`是否可以安全地用于获取自动数组的最后一个元素?


我知道通常的方法是计算sizeof(array)/sizeof(*array)以获取数组中元素的数量。(并且在注释中已向我指出C ++具有std::size(array)。)

因此,我认为如果可以到达最后一个元素之后的地址,则可以使用指针数学运算来计算该数字。但是,后来我想到我可以:

&array + 1
Run Code Online (Sandbox Code Playgroud)

但是,此值的类型是指向数组的指针,因此要使数学正常工作,我需要取消引用此值。

const auto N = *(&array + 1) - array;
Run Code Online (Sandbox Code Playgroud)

在C和C ++中是否有允许这种取消引用合法的津贴?

我知道您可以指向数组最后一个元素之后的一个,但是您不能取消引用它。但是,此取消引用会产生一个数组对象,该对象立即衰减为指向其第一个元素的指针。

我可以使用a reinterpret_cast来避免使用取消引用运算符,但是我想知道在这种情况下C和/或C ++语言是否允许取消引用。


我错过了类似的问题,但是这个问题有细微的不同。我已经了解了代码的工作原理,并且了解了将指针从数组的最后一个元素后移去通常存在问题。我要问的是,数组对象在表达式中使用时会衰减为指针的事实是否允许例外。我认为这可能是因为,取消引用指向对象的指针通常会导致对象值本身在表达式中使用(如果对象不存在,这将是一个问题)。

c c++ arrays pointers language-lawyer

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

os x进程状态UE

我已经运行了无法杀死的进程.这是我的EyeTV应用程序,这里是'ps aux'所说的:

cb0      87583   1,0  3,4   812796 144236   ??  UE   21Nov09 2638:11.45 [.....]/EyeTV
Run Code Online (Sandbox Code Playgroud)

过程状态真的很奇怪,因为我以前从未见过UE.该联机帮助表告诉我


U表示在不间断等待中标记进程

E表示该过程正试图退出


但我无法杀死这个过程.任何想法我怎么能强迫它退出?

附加信息:以下任何一项法规均无效:

  • 杀死-S KILL
  • 杀了-S QUIT
  • 杀-2
  • 杀了-9

macos state process

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

斐波那契数列 - 递归求和

好吧,我最初编写了一个简单的代码,根据用户输入从系列中返回斐波纳契数.

n = 5将产生3 ..

static int fibonacci(int n) {
        if (n == 1)
            return 0;
        else if (n == 2)
            return 1;
        else
            return (fibonacci(n - 1) + fibonacci(n - 2));
    }
Run Code Online (Sandbox Code Playgroud)

我正在考虑修改代码以返回系列的总和,而不是仅仅返回系列中的值,并且在尝试执行总和时我不小心将1添加到return语句中,令我惊讶的是,它正确地返回了总和.

对于n = 5,以下代码将返回7.

我不确定这是否是计算总和的正确方法......

如果我加1,我仍然无法弄清楚该系列的总和是如何工作的.有人可以解释一下吗?

static int fibonacci(int n) {
    if (n == 1)
        return 0;
    else if (n == 2)
        return 1;
    else
        return (fibonacci(n - 1) + fibonacci(n - 2)+(1));
}
Run Code Online (Sandbox Code Playgroud)

编辑:

对于斐波那契系列.. 0,1,1,2,3,5,8,13,21,34,55,89,144 ....

我尝试了一些随机的n

N = 13

该函数返回376

0 + 1 + …

java math recursion fibonacci

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

如何从std :: list中实现O(1)擦除

问题是std::list用于实现O(1)清除列表项的推荐方法是什么?

通常,当我选择双向链表时,我希望能够在O(1)时间内从列表中删除元素,然后在O(1)时间内将其移动到不同的列表中.如果元素有自己的prevnext指针,那么完成工作就没有真正的诀窍.如果列表是双向链接循环列表,则删除不一定需要知道包含该项目的列表.

根据迭代器失效规则,std::list迭代器非常耐用.因此,std::list在我自己的项目上使用时,我似乎得到了我想要的行为,就是在我的类中隐藏一个迭代器,以及包含列表.

class Item {
    typedef std::shared_ptr<Item> Ptr;
    struct Ref {
        std::list<Ptr>::iterator iter_;
        std::list<Ptr> *list_;
    };
    Ref ref_;
    //...
};
Run Code Online (Sandbox Code Playgroud)

这有一个缺点,我需要创建自己的装饰版本std::list,知道ref_每当项目添加到列表时更新.我想不出一种不需要嵌入式迭代器的方法,因为没有一种方法意味着擦除会首先引发O(n)查找操作.

使用O(1)擦除的推荐方法是什么std::list?或者,是否有更好的方法来实现目标?


在过去,我通过实现自己的列表数据结构来实现这一点,其中放置在列表中的项目具有其自己的next和prev指针.管理这些指针很自然,因为它们是列表操作本身固有的(我的列表实现的API调整指针).如果我想使用STL,那么最好的方法是什么?我提出了嵌入迭代器的稻草人提议.有更好的方法吗?

如果需要具体的用例,请考虑使用计时器.创建计时器时,会将其放入适当的列表中.如果取消,则希望有效地将其除去.(此特定示例可以通过标记而不是删除来解决,但它是实现取消的有效方法.)可根据请求提供其他用例.


我探索的另一个选择是将a std::list与a 融合std::unordered_map以创建指针类型的专用列表.这是更重量级的(因为哈希表),但提供了一个非常接近接口级标准容器的容器,并给我O(1)删除列表元素.稻草人提案中缺少的唯一特征是指向当前包含该项目的列表的指针.我已在CodeReview上提出当前的实现以征求意见.

c++ stdlist c++11

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

C中的生成器设计模式

有没有办法在C中实现构建器设计模式?特别是,我想知道是否有一个通过Builder在结构中设置值,但是在构造生成结构后,结构是只读的.我在网上搜索了一些例子,但在C中找不到任何例子.谢谢.

c design-patterns

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

通过NUMA环回优化套接字数据传输

我正在查看Linux环回和IP网络数据处理,似乎没有代码可以覆盖不同套接字上的2个CPU通过环回传递数据的情况.

我认为应该可以检测到这种情况,然后在可用时应用硬件DMA,以避免NUMA争用将数据复制到接收器.

我的问题是:

  • 我是否认为目前在Linux中没有这样做?
  • 我认为这可能在正确的轨道上?
  • 我应该学习哪些内核API或现有的驱动程序来帮助完成这种版本的环回?

x86 x86-64 linux-kernel numa dma

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

使用 ld 创建非 PIC 共享库

我有一堆在没有该-fPIC选项的情况下编译的目标文件。因此对函数的调用不使用@PLT. (源代码是 C 语言并用 编译clang)。

我想将这些对象文件链接到一个共享库中,我可以使用dlopen. .so我需要这样做,因为在加载实际内容之前我必须进行大量设置。

但每次我尝试链接该-shared选项时,都会收到错误 -

创建共享库时不能使用R_X86_64_PC32针对符号的重定位;splay_tree_lookup重新编译-fPIC

我从源代码重新编译没有任何问题。但我不想使用-fPIC. 这是我们正在开发自定义编译器的研究项目的一部分。PIC 不适用于我们试图在编译器中提供的保证类型。

是否有一些我可以使用的标志,ld以便它生成加载时重定位库。事实上,我没有搬家,也没什么问题。我可以为库提供基地址,dlopen如果虚拟地址不可用,则可能会失败。

我用来编译c文件的命令相当于 -

clang -m64 -c foo.c
Run Code Online (Sandbox Code Playgroud)

为了链接我正在使用

clang -m64 -shared *.o -o foo.so
Run Code Online (Sandbox Code Playgroud)

我说等效是因为它是一个自定义编译器(forked off clang)并且有一些额外的步骤。但它是等价的。

c linux linker ld

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