Tag: c

通过malloc进行VLA和动态内存分配有什么区别?

我很好奇这个: 有什么不同之处: const int MAX_BUF = 1000; char* Buffer = malloc(MAX_BUF); 和: char Buffer[MAX_BUF];

VS2013中C99支持的官方状态是什么?

我看到VS2013增加了对C99的大量主要核心语言function的支持。 现在它支持复合文字,指定初始化器,可变参数宏,交错声明和语句,仅举几例。 这表明VS开发人员在Visual Studio中为C99支持做了认真的步骤。 然而,其中一些function并不是C ++语言的一部分,这似乎与之前宣布的开发策略有明显的偏差(例如“VS C编译器只支持那些也是C ++一部分的C99function”)。 那么,有什么官方或半官方的话说明发生了什么? 我似乎无法在网上找到任何确定的东西。 这些C99function是否正式公布? 是否承诺继续在VS中提供C99支持? 或者这只是某种“流氓”的非官方发展?

让父母等待所有子进程完成

我希望有人可以说明如何让父母等待所有子进程完成后继续fork之后。 我有清理代码,我想运行但子进程需要返回才能发生这种情况。 for (int id=0; id<n; id++) { if (fork()==0) { // Child exit(0); } else { // Parent … } … }

从字符串中获取IPv4地址的最快方法

我有以下代码,比inet_addr快约7倍。 我想知道是否有办法改进这个以使其更快或者如果存在更快的替代方案。 这段代码要求提供一个有效的空终止IPv4地址,没有空格,在我的情况下总是这样,所以我针对这种情况进行了优化。 通常你会有更多的错误检查,但如果有办法使更快或更快的替代存在,我会非常感激。 UINT32 GetIP(const char *p) { UINT32 dwIP=0,dwIP_Part=0; while(true) { if(p[0] == 0) { dwIP = (dwIP << 8) | dwIP_Part; break; } if(p[0]=='.') { dwIP = (dwIP << 8) | dwIP_Part; dwIP_Part = 0; p++; } dwIP_Part = (dwIP_Part*10)+(p[0]-'0'); p++; } return dwIP; }

查找字符串的所有唯一排列而不生成重复项

通过众所周知的Steinhaus-Johnson-Trotter算法找到字符串的所有排列。 但是如果字符串包含重复的字符,例如 AABB, 然后可能的唯一组合将是4!/(2!* 2!)= 6 实现此目的的一种方法是我们可以将其存储在数组中,然后删除重复项。 有没有更简单的方法来修改Johnson算法,因此我们永远不会生成重复的排列。 (以最有效的方式)

两个字符串指向不同字符串文字的地址是相同的

#include #include int main() { char * p = “abc”; char * p1 = “abc”; printf(“%d %d”, p, p1); } 当我打印两个指针的值时,它打印相同的地址。 为什么?

如何通知select()立即返回?

我有一个工作线程正在侦听TCP套接字以获取传入流量,并缓冲接收到的主线程要访问的数据(让我们称之为套接字A )。 但是,工作线程也必须做一些常规操作(比如每秒一次),即使没有数据进入。因此,我使用select()超时,这样我就不需要继续轮询。 (注意,在非阻塞套接字上调用receive()然后hibernate一秒钟并不好:即使主线程可能无法立即处理它,主线程也应立即可用传入数据。因此需要缓冲。) 现在,我还需要能够发信号通知工作线程立即执行其他操作; 从主线程,我需要让工作线程的select()返回。 现在,我已经解决了这个问题(从这里和这里基本采用的方法): 在程序启动时,工作线程为此创建了一个数据报(UDP)类型的附加套接字,并将其绑定到某个随机端口(让我们称之为套接字B )。 同样,主线程创建一个数据报套接字用于发送。 在调用select() ,工作线程现在在fd_set列出A和B. 当主线程需要发出信号时,它会将几个字节发送到sendto()几个字节到localhost上的相应端口。 回到工作线程中,如果在select()返回后B保留在fd_set ,则调用recvfrom()并忽略接收的字节。 这似乎工作得很好,但我不能说我喜欢这个解决方案,主要是因为它需要为B绑定一个额外的端口,还因为它增加了几个额外的套接字API调用,这可能会失败我猜 – 我不知道真的想要找出每个案件的适当行动。 我认为理想情况下,我想调用一些以A作为输入的函数,除了使select()返回之外什么都不做。 但是,我不知道这样的function。 (我想我可以例如shutdown()套接字,但副作用不是真的可以接受:) 如果这是不可能的,那么第二个最佳选择是创建一个比真正的UDP套接字更糟糕的B ,并且实际上并不需要分配任何有限的资源(超出合理的内存量)。 我想Unix域套接字就可以做到这一点,但是:解决方案不应该比现在的解决方案少得多,尽管有一些适量的#ifdef东西很好。 (我主要针对Windows和Linux – 并且顺便编写C ++。) 请不要建议重构以摆脱两个单独的线程。 这种设计是必要的,因为主线程可能会被长时间阻塞(例如,做一些密集的计算 – 我无法从最里面的计算循环开始定期调用receive() ),同时,有人需要缓冲传入的数据(由于我无法控制的原因,它不能是发送者)。 现在我正在写这篇文章,我意识到有人肯定会简单地回复“ Boost.Asio ”,所以我刚刚看了它……但是找不到明显的解决方案。 请注意,我也不能(轻松地)影响套接字A的创建方式,但如果需要,我应该能够让其他对象包装它。

将一个结构指针转换为另一个 – C

请考虑以下代码。 enum type {CONS, ATOM, FUNC, LAMBDA}; typedef struct{ enum type type; } object; typedef struct { enum type type; object *car; object *cdr; } cons_object; object *cons (object *first, object *second) { cons_object *ptr = (cons_object *) malloc (sizeof (cons_object)); ptr->type = CONS; ptr->car = first; ptr->cdr = second; return (object *) ptr; } […]

CPU TSC提取操作,尤其是在多核多处理器环境中

在Linux世界中,要获得纳秒精度定时器/时钟提示,可以使用: #include int foo() { timespec ts; clock_gettime(CLOCK_REALTIME, &ts); //–snip– } 这个答案提出了一种使用RDTSC指令直接查询cpu时钟的asm方法。 在多核,多处理器架构中,如何在多个内核/处理器之间同步此时钟滴答/定时器值? 我的理解是,在固有的围栏中完成了。 这种理解是否正确? 你能否提出一些可以详细解释这个问题的文件? 我对Intel Nehalem和Sandy Bridge微体系结构感兴趣。 编辑 将进程限制为单个核心或cpu不是一种选择,因为该进程非常庞大(就消耗的资源而言)并且希望最佳地利用包含所有核心和处理器的机器中的所有资源。 编辑 感谢您确认TSC在核心和处理器之间同步。 但我最初的问题是这种同步是如何完成的? 它是否带有某种围栏? 你知道任何公共文件吗? 结论 感谢所有输入:以下是此讨论的结论:TSC在初始化时使用在多处理器/多核系统中的核心和处理器之间发生的RESET进行同步。 之后,每个Core都是独立的。 TSC保持不变,具有锁相环,可以规范频率变化,从而规范给定内核中的时钟变化,这就是TSC在内核和处理器之间保持同步的方式。

静态变量存储在C和C ++中的哪个位置?

在可执行文件的哪个段(.BSS,.DATA,其他)中存储了静态变量,以便它们没有名称冲突? 例如: foo.c: bar.c: static int foo = 1; static int foo = 10; void fooTest() { void barTest() { static int bar = 2; static int bar = 20; foo++; foo++; bar++; bar++; printf(“%d,%d”, foo, bar); printf(“%d, %d”, foo, bar); } } 如果我编译这两个文件并将其链接到重复调用fooTest()和barTest的main,则printf语句将独立增加。 有意义,因为foo和bar变量是翻译单元的本地变量。 但是存储分配在哪里? 需要明确的是,假设您有一个工具链可以输出ELF格式的文件。 因此,我认为在可执行文件中必须为这些静态变量保留一些空间。 出于讨论目的,我们假设我们使用GCC工具链。