正如我最近发布的这个答案所示,我似乎对volatile多线程编程环境中的实用程序(或缺乏实用程序)感到困惑.
我的理解是这样的:每当一个变量可以在访问它的一段代码的控制流之外被改变时,该变量应该被声明为volatile.信号处理程序,I/O寄存器和由另一个线程修改的变量都构成这种情况.
所以,如果你有一个全局int foo,并且foo由一个线程读取并由另一个线程原子设置(可能使用适当的机器指令),则读取线程看到这种情况的方式与它看到由信号处理程序调整的变量或由外部硬件条件修改,因此foo应该声明volatile(或者,对于多线程情况,使用内存隔离负载访问,这可能是一个更好的解决方案).
我怎么错,哪里错了?
好吧,所以我听起来不像白痴我会更明确地陈述问题/要求:
NULL如果找不到匹配项.......以及"最快"的意思:
O(n)where n= haystack长度.(但是O(nm)如果它们与更强大的算法组合以给出确定性O(n)结果,则可以使用通常(例如滚动哈希)算法的思想.if (!needle[1])等等)比天真蛮力算法更糟糕,特别是在非常短的针上,这可能是最常见的情况.(无条件的重预处理开销是不好的,因为试图以可能的针头为代价来改善病理针的线性系数.)我目前的实现比glibc实现的双向大约慢10%和8倍(取决于输入).
更新:我目前的最佳算法如下:
strchr.我脑海中留下的重大问题是:
O(m)(其中m是针长)可以用于m<100左右.如果针对针的简单测试可能仅需要线性时间,那么也可以使用最坏情况二次方的算法.奖励积分:
注意:我很清楚那里的大多数算法,而不是它们在实践中的表现.这是一个很好的参考,所以人们不会继续给我作为评论/答案的算法参考:http://www-igm.univ-mlv.fr/~lecroq/string/index.html
我见过程序员使用这个公式
mid = start + (end - start) / 2
Run Code Online (Sandbox Code Playgroud)
而不是使用更简单的公式
mid = (start + end) / 2
Run Code Online (Sandbox Code Playgroud)
用于查找数组或列表中的中间元素.
他们为什么使用前者呢?
我正在将一个为Unix编写的相对简单的控制台程序移植到Windows平台(Visual C++ 8.0).所有源文件都包含"unistd.h",它不存在.删除它,我得到关于'srandom','random'和'getopt'错误原型的投诉.我知道我可以替换随机函数,我很确定我可以找到/ hack-up一个getopt实现.
但我相信其他人也遇到了同样的挑战.我的问题是:Windows中有"unistd.h"端口吗?至少有一个包含那些具有本机Windows实现的功能 - 我不需要管道或分叉.
编辑:
我知道我可以创建我自己的"unistd.h",其中包含我需要的东西的替换 - 特别是在这种情况下,因为它是一个有限的集合.但是,由于它似乎是一个常见的问题,我想知道是否有人已经为更大的功能部分完成了工作.
无法在工作中切换到不同的编译器或环境 - 我坚持使用Visual Studio.
编译几个二进制文件时,我收到了一些警告:
warning: incompatible implicit declaration of built-in function ‘strcpy’
warning: incompatible implicit declaration of built-in function ‘strlen’
warning: incompatible implicit declaration of built-in function ‘exit’
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我补充道
#include <stdlib.h>
Run Code Online (Sandbox Code Playgroud)
在与此警告关联的C文件的顶部,除了使用以下标志进行编译之外:
CFLAGS = -fno-builtin-exit -fno-builtin-strcat -fno-builtin-strncat -fno-builtin-strcpy -fno-builtin-strlen -fno-builtin-calloc
Run Code Online (Sandbox Code Playgroud)
我正在使用GCC 4.1.2:
$ gcc --version
gcc (GCC) 4.1.2 20080704
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决这些警告?
我见过C中的定义
#define TRUE (1==1)
#define FALSE (!TRUE)
Run Code Online (Sandbox Code Playgroud)
这有必要吗?简单地将TRUE定义为1,将FALSE定义为0有什么好处?
我正在制作一个C程序,我需要从中获取程序启动的目录.该程序是为UNIX计算机编写的.我一直在寻找opendir()和telldir(),但telldir()返回off_t (long int),所以它确实没有帮助我.
如何在字符串(char数组)中获取当前路径?
在几个C++示例中,我看到使用size_t类型,我将使用一个简单的int.有什么区别,为什么size_t应该更好?
自从我多年前意识到这一点,默认情况下这不会产生错误(至少在GCC中),我一直想知道为什么?
我知道您可以发出编译器标志来产生警告,但是它不应该总是出错吗?为什么非void函数没有返回值才有效?
评论中要求的示例:
#include <stdio.h>
int stringSize()
{
}
int main()
{
char cstring[5];
printf( "the last char is: %c\n", cstring[stringSize()-1] );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...编译.
我对字符串文字的分配/存储感兴趣.
我确实在这里找到了一个有趣的答案,说:
定义内联字符串实际上是将数据嵌入程序本身并且无法更改(某些编译器通过智能技巧允许这样做,不要打扰).
但是,它与C++有关,更不用说它不打扰了.
我很烦.= d
所以我的问题是我的字符串文字保存在哪里以及如何保存?我为什么不试着改变呢?实施是否因平台而异?有没有人愿意详细说明"聪明的伎俩"?