我知道这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) 我有一个程序在窗口中显示具有固定帧速率(比如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(它是一些不赞成使用的功能的替代方案)但是这会为我相对简单的问题添加更多的样板代码(我怀疑需要额外的开销).
我们有一个函数宏#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一起使用.
我用这个去获取目录foo的内容:FindFirstFile(L"foo\\*", &findData).当foo是常规目录时,它工作得很好.但是,当foo是指向另一个目录(创建时mklink /j foo C:\gah)的联结时,FindFirstFile失败.
文档有这样的说法:"如果路径指向符号链接,则WIN32_FIND_DATA缓冲区包含有关符号链接的信息,而不是目标." 但是当我运行调试器时,我只是得到了一个INVALID_HANDLE_VALUE并且findData保持不变.
那么,我该如何解决这个问题呢?