我有一个简单的程序,首先将一些本机x86指令写入声明的缓冲区,然后设置一个指向此缓冲区的函数指针并进行调用.但是,当在堆栈上分配缓冲区时(而不是在堆上,甚至在全局数据区中),我注意到严重的性能损失.我验证了数据缓冲区中指令序列的开始是在一个16字节的边界上(我假设这是cpu需要(或想要)的内容).我不知道为什么它会在我执行指令的过程中产生影响,但在下面的程序中,"GOOD"在我的双核工作站上执行4秒钟,而"BAD"需要6分钟左右.是否存在某种对齐/ i-cache /预测问题?我对VTune的评估许可刚刚结束,所以我甚至无法对此进行分析:(.谢谢.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int (*funcPtrType)(int, int);
int foo(int a, int b) { return a + b; }
void main()
{
// Instructions in buf are identical to what the compiler generated for "foo".
char buf[201] = {0x55,
0x8b, 0xec,
0x8b, 0x45, 0x08,
0x03, 0x45, 0x0c,
0x5D,
0xc3
};
int i;
funcPtrType ptr;
#ifdef GOOD
char* heapBuf = (char*)malloc(200);
printf("Addr of heap buf: %x\n", &heapBuf[0]);
memcpy(heapBuf, buf, 200);
ptr = (funcPtrType)(&heapBuf[0]);
#else // BAD …Run Code Online (Sandbox Code Playgroud) 此代码在数组声明期间产生分段错误.我很困惑为什么会这样.我故意选择2000000000作为值,因为它低于2 ^ 31并且可以适合整数变量.
int main()
{
int nums_size = 2000000000;
int nums[nums_size];
int i;
for(i = 0; i < nums_size; i++) {
nums[i] = i;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我们设计了一种特殊的通讯工具,用于轮椅控制灯等.我们使用Z波.我们有应用程序通过PC控制这些设备.
不幸的是,该应用程序需要一个USB棒.我们的设计不允许USB连接棒.相反,我们使用通过蓝牙和虚拟配件链接到电脑的串行接口模块.我们知道该应用程序使用HID标准的windriver.(没有涉及第三方司机)
我们想知道我们是否可以使用HID"包装"驱动程序来模拟USB标识符和PnP,方式是应用程序认为连接棒,然后将蓝牙虚拟配置数据链接到应用程序.
设备地址,物理地址和虚拟地址有什么区别?
其实我mmap在司机中试图,我坚持这个概念.
在不使用PHP5.0的datetime对象的情况下,在两个日期之间获取每个星期五,星期六和星期日的简单方法是什么.
由于速度我不想在1/1和31/12之间遍历每个日期.(作为结果视图的一部分,每页我必须计算至少50次:).
我需要设计一个可以将对象作为参数的方法,如果没有,那么方法必须自己创建一个新对象.
这是一个很好的方法吗?
public void Method1(int companyId, int userId, int clientId)
{
Method1(null, companyId, userId, clientId);
}
public void Method1(SpecialObject o, int companyId)
{
if(o == null)
o = new SpecialObject(userId, clientId);
}
Run Code Online (Sandbox Code Playgroud)