我一直在阅读实时系统以及它们如何工作等等.我正在查看维基百科的文章,其中说每次移动带有计时器的国际象棋游戏可以被认为是实时系统,因为程序必须计算那个时候的举动.其他游戏怎么样?我们知道,游戏通常会尝试以25+ FPS运行,它是否可以被视为软实时系统,因为如果它低于25(我使用25作为预定义的阈值btw)它不是结束世界,只是我们想要的表现?
此外 - 游戏还有他们必须处理的事件.用户使用键盘/鼠标,并且系统必须在(再次)预定时间内相应地回答那些事件,然后才认为游戏"失败".
哦,我现在正在谈论单人游戏,以保持简单.
这听起来像游戏符合软实时系统标准,但我想知道我是否遗漏了任何东西......谢谢.
我正在尝试学习算法分析,但我陷入了asymptotic notation
(大O...)和cases
(最佳、最差和平均)之间的关系。
我了解到该Big O
符号定义了算法的上限,即它定义函数的增长不能超过其上限。
起初,我觉得它计算的是最坏的情况。我谷歌了一下(为什么最坏的情况不是大O?)并得到了大量的答案,这些答案对于初学者来说并不那么容易理解。
我的结论如下:
Big O
并不总是用来表示算法的最坏情况分析,因为,假设一个算法对最佳、平均和最差输入采取 O(n) 执行步骤,那么它的最佳、平均和最坏情况可以表示为 O (n)。
请告诉我我是否正确或者我遗漏了什么,因为我没有人来验证我的理解。请提出一个更好的例子来理解为什么Big O
并不总是如此worst case
。
我不相信这是重复的(见下文)。†
我发现这个问题几乎是一个精确的重复,但是我认为答案无法分析漏洞。请参阅:*((*(&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 ++语言是否允许取消引用。
†我错过了类似的问题,但是这个问题有细微的不同。我已经了解了代码的工作原理,并且了解了将指针从数组的最后一个元素后移去通常存在问题。我要问的是,数组对象在表达式中使用时会衰减为指针的事实是否允许例外。我认为这可能是因为,取消引用指向对象的指针通常会导致对象值本身在表达式中使用(如果对象不存在,这将是一个问题)。
我已经运行了无法杀死的进程.这是我的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表示该过程正试图退出
但我无法杀死这个过程.任何想法我怎么能强迫它退出?
附加信息:以下任何一项法规均无效:
好吧,我最初编写了一个简单的代码,根据用户输入从系列中返回斐波纳契数.
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 + …
问题是std::list
用于实现O(1)清除列表项的推荐方法是什么?
通常,当我选择双向链表时,我希望能够在O(1)时间内从列表中删除元素,然后在O(1)时间内将其移动到不同的列表中.如果元素有自己的prev
和next
指针,那么完成工作就没有真正的诀窍.如果列表是双向链接循环列表,则删除不一定需要知道包含该项目的列表.
根据迭代器失效规则,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中实现构建器设计模式?特别是,我想知道是否有一个通过Builder在结构中设置值,但是在构造生成结构后,结构是只读的.我在网上搜索了一些例子,但在C中找不到任何例子.谢谢.
我正在查看Linux环回和IP网络数据处理,似乎没有代码可以覆盖不同套接字上的2个CPU通过环回传递数据的情况.
我认为应该可以检测到这种情况,然后在可用时应用硬件DMA,以避免NUMA争用将数据复制到接收器.
我的问题是:
我有一堆在没有该-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
)并且有一些额外的步骤。但它是等价的。