小编mae*_*aep的帖子

零内存的速度比使用memset更快?

我知道这memset(ptr, 0, nbytes)很快,但有更快的方法(至少在x86上)?

我假设memset使用mov,但是当大多数编译器将内存归零时,xor因为它更快,更正确吗?edit1:错了,因为GregS指出只适用于寄存器.我在想什么?

另外我问一个比我更熟悉汇编程序的人看看stdlib,他告诉我x86 memset没有充分利用32位宽的寄存器.然而当时我很累,所以我不太确定我是否理解正确.

edit2:我重新审视了这个问题并进行了一些测试.这是我测试的:

    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    #include <sys/time.h>

    #define TIME(body) do {                                                     \
        struct timeval t1, t2; double elapsed;                                  \
        gettimeofday(&t1, NULL);                                                \
        body                                                                    \
        gettimeofday(&t2, NULL);                                                \
        elapsed = (t2.tv_sec - t1.tv_sec) * 1000.0 + (t2.tv_usec - t1.tv_usec) / 1000.0; \
        printf("%s\n --- %f ---\n", #body, elapsed); } while(0)                 \


    #define SIZE 0x1000000

    void zero_1(void* buff, size_t size)
    {
        size_t i;
        char* foo …
Run Code Online (Sandbox Code Playgroud)

c std

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

如何直接写入GTK/GDK中的显示缓冲区

我有一个程序在窗口中显示具有固定帧速率(比如30 fps)的动画.

目前我使用SDL但不幸的是它缺乏桌面集成(如拖放),现在我想使用GTK.

所以我想做什么(假设窗口是双缓冲的):

1 obtain off-screen buffer
2 render my stuff to buffer
3 tell the toolkit to swap buffers
4 update window
5 repeat
Run Code Online (Sandbox Code Playgroud)

除了非常基本的GDK/GTK调用之外,我不想使用任何功能来创建和管理窗口并接收输入事件.

FAQ中他们建议使用GdkRGB.但是,在GdkRGB的官方文档中,他们使用了gdk_draw_rgb_image()不推荐使用的功能,实际上大多数GdkRGB功能都是.

作为替代方案,他们建议使用OpenGL.问题是它需要一些不常见的库,如GtkGLArea,它不是GTK的一部分(我不想依赖任何默认安装的库).此外,在我的系统上,驱动程序的OpenGL支持是有限的.

我已经研究了Cairo(它是一些不赞成使用的功能的替代方案)但是这会为我相对简单的问题添加更多的样板代码(我怀疑需要额外的开销).

c linux gtk gdk

8
推荐指数
1
解决办法
1679
查看次数

功能宏,其计算结果为零,可用作语句

我们有一个函数宏#define FOO(arg) foo(arg)int foo(const char* bar);.当定义NDEBUG时,FOO被定义为#define FOO(arg) 0,但是这会导致许多编译器警告,因为在许多情况下不使用FOO的返回值.该解决方案应与ANSI C编译器一起使用,并且不会发出警告.我试过了:

(void)0:不能分配给变量

static int foo(const char* bar) { return 0; } :在某些模块中导致未使用的静态功能警告

static inline int foo(const char* bar) { return 0; } :仅适用于C99编译器

谢谢你的帮助!

edit1:它有点像跟踪宏,并在整个项目中使用.它主要用作声明FOO("function x called");,但在我看到的一些情况下if (FOO("condition a")) { /* some more debug output */ }.在NDEBUG定义和优化的情况下,FOO不应该留下任何东西.我没有拿出这个,但我必须清理这个烂摊子:).

edit2:我应该补充一点,对于gcc release build,使用了这些标志:-O3 -Wall -ansi

edit3:现在我要去__inline int dummy() { return 0; }.__inline在ansi模式下与VisualC和GCC一起使用.

c c-preprocessor

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

FindFirstFile和Junctions

我用这个去获取目录foo的内容:FindFirstFile(L"foo\\*", &findData).当foo是常规目录时,它工作得很好.但是,当foo是指向另一个目录(创建时mklink /j foo C:\gah)的联结时,FindFirstFile失败.

文档有这样的说法:"如果路径指向符号链接,则WIN32_FIND_DATA缓冲区包含有关符号链接的信息,而不是目标." 但是当我运行调试器时,我只是得到了一个INVALID_HANDLE_VALUE并且findData保持不变.

那么,我该如何解决这个问题呢?

c windows winapi

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

标签 统计

c ×4

c-preprocessor ×1

gdk ×1

gtk ×1

linux ×1

std ×1

winapi ×1

windows ×1