给出一些源文件test.cpp我想创建一个共享库libtest.so.我试图在automake文件的范围内这样做但是我似乎无法让它工作.
例如,在g ++下,我执行以下操作:
g++ -shared -fPIC test.cpp -o libtest.so
Run Code Online (Sandbox Code Playgroud)
然后我可以创建另一个依赖于共享库的文件,如下所示:
g++ mytest.cpp libtest.so -o blah
Run Code Online (Sandbox Code Playgroud)
我读过,automake只支持通过libtool创建共享库.我试图让我的automake scriupt工作如下,但它似乎永远不会产生.so.我得到的最接近的是生成.la和.o文件:
在configure.ac中:
AC_ENABLE_SHARED
AC_DISABLE_STATIC
AC_PROG_LIBTOOL(libtool)
Run Code Online (Sandbox Code Playgroud)
在Makefile.am中
lib_LTLIBRARIES=libtest.la
libtest_la_SOURCES=test.cpp
libtest_la_CFLAGS=-fPIC
libtest_la_CPPFLAGS=-fPIC
libtest_la_CXXFLAGS=-fPIC
libtest_la_LDFLAGS= -shared -fPIC
Run Code Online (Sandbox Code Playgroud)
有人能给我一个基于上述构建.so的例子吗?
所以最近我考虑strcpy并回到K&R,他们将实现显示为
while (*dst++ = *src++) ;
Run Code Online (Sandbox Code Playgroud)
但是我错误地把它转录为:
while (*dst = *src)
{
src++; //technically could be ++src on these lines
dst++;
}
Run Code Online (Sandbox Code Playgroud)
在任何情况下,让我思考编译器是否真的会为这两个代码生成不同的代码.我最初的想法是它们应该几乎相同,因为src和dst正在增加但从未使用过我认为编译器会知道不会尝试在生成的机器代码中将它们作为"变量"进行实际保存.
在32位发布模式(/ O2)中使用带有VS 2010 C++ SP1构建的windows7,我获得了上述两种版本的反汇编代码.为了防止函数本身直接引用输入并进行内联,我使用每个函数创建了一个dll.我省略了制作的ASM的序幕和尾声.
while (*dst++ = *src++)
6EBB1003 8B 55 08 mov edx,dword ptr [src]
6EBB1006 8B 45 0C mov eax,dword ptr [dst]
6EBB1009 2B D0 sub edx,eax //prepare edx so that edx + eax always points to src
6EBB100B EB 03 jmp docopy+10h (6EBB1010h)
6EBB100D 8D 49 00 lea ecx,[ecx] //looks like align padding, …Run Code Online (Sandbox Code Playgroud) 使用VS 2010进行全面优化/ Ox查看以下两个函数调用:
static string test1(const string& input)
{
return input;
}
static void test2(const string& input, string& output)
{
output = input;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用后一个test2,那么函数总是被优化出来并且内联代码.但是,除非我关闭异常,否则不会内联test1.有人知道为什么吗?
另外,我希望编译器能够在test1中作为test2的高效工作,如果它使用返回值优化,但似乎没有这样做.这也令我感到困惑.
我想使用第一个函数签名的原因是我有两个可编译的函数版本.我希望调用代码始终调用test1,并且当设置某个编译标志时,我希望它将输入附加到副本并返回它,当未设置编译标志时我希望它接近于否 - 尽可能.
c++ optimization inline compiler-optimization return-value-optimization
我有一个非常简单的游戏循环使用GLFW如下(Windows x64发布模式)
我希望程序执行得非常快,但是看起来下面计算的delta总是16.667ms,这似乎是glfw以某种方式限制了我的主循环的速度.这不是问题,因为我不关心超过60hz.但是,进程资源管理器和Windows任务管理器报告我的程序正在使用大部分cpu核心.
特别是吃似乎glfwSwapBuffers()吃了很多cpu,即使我什么也没画.删除该调用会将cpu使用率降低到0.5%.
顺便说一下,我的睡眠功能几乎从未被调用,因为增量总是接近16.6ms.
main ()
{
double prevTime = glfwGetTime();
//init glfw ..
while(!glfwWindowShouldClose(window))
{
double time0=glfwGetTime();
double delta = time0- prevTime;
if (delta >= g_FrameInterval)
{
glfwPollEvents();
prevTime= time0;
glfwSwapBuffers(window);
}
else
{
Sleep(10);
}
}
}
Run Code Online (Sandbox Code Playgroud) 是否有 Windows 等效的 linux 命令“perf stat”?例如查看前端停顿、缓存未命中和其他性能计数器数据?
我读了一篇文章(1.5岁http://www.drdobbs.com/parallel/cache-friendly-code-solving-manycores-ne/240012736),其中讨论了缓存性能和数据大小.他们展示了以下代码,他们说这些代码是在i7(沙桥)上运行的
static volatile int array[Size];
static void test_function(void)
{
for (int i = 0; i < Iterations; i++)
for (int x = 0; x < Size; x++)
array[x]++;
}
Run Code Online (Sandbox Code Playgroud)
他们声称如果他们保持Size*Iterations不变,增加Size,当数组内存中的大小增加超过L2缓存大小时,他们会观察到执行时间(10x)的巨大峰值.
作为我自己的练习,我想尝试一下,看看我是否可以为我的机器重现他们的结果.(i7 3770k,win7,visual c ++ 2012编译器,Win32调试模式,未启用优化).令我惊讶的是,我无法看到执行所花费的时间增加(甚至超过L3缓存大小),这让我觉得编译器在某种程度上优化了这段代码.但我也没有看到任何优化.我看到的唯一的速度变化是,在我的机器的字大小以下,它需要稍长.以下是我的时间,代码清单和相关的反汇编.
有谁知道原因:
1)为什么不管阵列的大小如何,所用的时间都不会增加?或者我怎么能找到?
2)为什么所花费的时间从高处开始然后减小直到达到缓存行大小,如果数据小于行大小,是否应该在没有从缓存读取的情况下处理更多迭代?
时序:
Size=1,Iterations=1073741824, Time=3829
Size=2,Iterations=536870912, Time=2625
Size=4,Iterations=268435456, Time=2563
Size=16,Iterations=67108864, Time=2906
Size=32,Iterations=33554432, Time=3469
Size=64,Iterations=16777216, Time=3250
Size=256,Iterations=4194304, Time=3140
Size=1024,Iterations=1048576, Time=3110
Size=2048,Iterations=524288, Time=3187
Size=4096,Iterations=262144, Time=3078
Size=8192,Iterations=131072, Time=3125
Size=16384,Iterations=65536, Time=3109
Size=32768,Iterations=32768, Time=3078
Size=65536,Iterations=16384, Time=3078
Size=262144,Iterations=4096, Time=3172
Size=524288,Iterations=2048, Time=3109
Size=1048576,Iterations=1024, Time=3094
Size=2097152,Iterations=512, Time=3313
Size=4194304,Iterations=256, Time=3391
Size=8388608,Iterations=128, …Run Code Online (Sandbox Code Playgroud) stackoverflow上有几个不同的主题,用于查找/删除目录中最旧的目录/文件.我已经阅读了很多这些,并且看到了无数不同的方式,显然对其他系统上的某些人有用,但在我的特定情况下却不适合我.
限制是:
我得到的最接近的是这样的(不完整):
find . -maxdepth 1 -d -name "Backup Set*" -print0 | xargs -0 stat -f "%m %N" | sort -r| awk 'NR>5'
Run Code Online (Sandbox Code Playgroud)
这给了我要删除的目录,但是现在它们的前面有时间戳,我不确定如果我剥离并管道到rm我将回到我无法删除带有空格的目录的情况.
输出:
1450241540 ./Backup Set1
1450241538 ./Backup Set0
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助.
我看过的相关帖子:
https://superuser.com/questions/552600/how-can-i-find-the-oldest-file-in-a-directory-tree