好吧,我不认为它真的很重要,但由于程序必须存储长度因为删除[]无论如何,为什么我们不能得到这个"存储信息"?
目前我不确定,我尝试制作高性能服务器,我有一个6Core CPU,所以如果我使用"io_service_per_cpu"设计,我有6个io_service.
我已经听说线程池设计不是最好的,但我不确定.
你有什么知识?有人已经用每个或其他东西做过压力测试吗?
所以基本上这是一个堆栈分配:
char inStack[10];
// and
MyStruct cl;
Run Code Online (Sandbox Code Playgroud)
这应该在堆中分配:
char* inHeap = new char[10];
// and
MyClass cl = new MyClass();
Run Code Online (Sandbox Code Playgroud)
如果MyClass包含char test[10]
变量怎么办?这是否MyClass cl = new MyClass()
意味着MyClass :: test的10byte长内容是在Heap而不是Stack中分配的
我现在正在学习DirectX,我读了很多关于VertexBuffer的内容.既然只是通过阅读就无法从编程中学习,我正在用DX11制作一个小型引擎(我的问题不是真的依赖于版本)
据我所知,在VertexBuffer中存储Vertices,实际上我将它存储在Graphic卡上.好吧,我读到了动态和静态缓冲区.所以,如果我理解正确,静态缓冲区初始化顶点,初始化顶点不会改变.好的,但我什么时候真的需要它.我的意思是在一个游戏或其他什么,我什么时候有恒定的顶点?也许对于一些UI对象..? - 但即使这些都不是每次都是不变的......你可以移动它们的2D位置......等等.
下一点是关于动态顶点缓冲区,例如:我有一个缓冲区,其中包含一些顶点,这些顶点被绘制.然后我想添加或删除一些顶点.什么现在..所以我只是"更新"缓冲区.但这是否真的对性能有益?想象一下地形编辑器.在那里你必须更新吨顶点.
今天我在运行时遇到了很奇怪的异常.我尝试逐步调试,但在main()
调用之前发生异常.
所以我删除了每个包含和整个代码(注释它),并添加了一个空main()
函数.
再次,编译后它会发生.也许一个项目配置错误?
BTW:异常后,VC10调试器进入strlen.asm并说空指针.
VS10解决方案得到了2个项目,第二个工作非常好,第一个也做了,但在我编译第二个项目后,它停止了工作.
项目具有相同的二进制输出,但是它们为每个项目获得了obj等文件的额外输出文件夹.
那么,那里有什么?
我刚开始从编译器输出中学习一点汇编程序.
test(1);
Run Code Online (Sandbox Code Playgroud)
这个简单的函数调用创建以下asm输出(用x64编译)
000000013FFF2E76 mov ecx,1
000000013FFF2E7B call test (13FFF33C0h)
Run Code Online (Sandbox Code Playgroud)
但为什么不呢:
000000013FFF2E76 push 1
000000013FFF2E7B call test (13FFF33C0h)
Run Code Online (Sandbox Code Playgroud)
我认为函数参数将是pushed
堆栈然后poped
在函数中.有人可以解释为什么VS更喜欢顶级的吗?
我已经编写了一个OpenCL内核,该内核使用opencl-opengl互操作性来读取顶点和索引,但是这可能甚至不重要,因为我只是在做简单的指针加法操作,以便按索引获取特定的顶点。
uint pos = (index + base)*stride;
Run Code Online (Sandbox Code Playgroud)
在这里,我正在计算绝对位置(以字节为单位),在我的示例中pos是28,643,328,步幅为28,索引= 0,基数= 1,022,976。好吧,这似乎是正确的。
不幸的是,我不能vload3
直接使用,因为offset参数不是以字节为单位的绝对地址。所以我只添加pos
了指针void* vertices_gl
void* new_addr = vertices_gl+pos;
Run Code Online (Sandbox Code Playgroud)
new_addr
在我的示例中= 0x2f90000,这是奇怪部分开始的地方,
vertices_gl
= 0x303f000
结果(new_addr
)应为0x4B90000(0x303f000 + 28,643,328)
我不明白为什么地址vertices_gl减少了716,800(0xAF000)
我的目标是GPU:AMD Radeon HD5830
附言:对于那些想知道的人,我正在使用printf来获取这些值:)(无法使CodeXL工作)
PacketBuilder是一个允许写入char*数组的类.附加功能:
template <class T>
void PacketBuilder::Append(const T value)
{
memcpy((&m_Buffer) + m_Index, (const void*) &value, sizeof(T));
m_Index += sizeof(T);
}
Run Code Online (Sandbox Code Playgroud)
编译没有错误.如果我调用Append并使用T作为无符号短(WORD).它很棒.如果我使用T作为unsigned char.我收到链接器错误.
m_Builder.Append<unsigned char>(0x01); // Error: LNK1120
m_Builder.Append<unsigned short>(0x0001); // Works
Run Code Online (Sandbox Code Playgroud)
来自VS2010的错误(我得到了德国vs2010):
错误LNK2019:Verweis aufnichtaufgelöstesexternes符号""public:void __thiscall PacketBuilder :: Append(unsigned char)"(?? $ Append @ E @ PacketBuilder @@ QAEXE @ Z)"在Funktion中""public:void __thiscall客户端: :DoHandshake(无效)"(?DoHandshake @ Client @@ QAEXXZ)".1> C:\ XXX\C++\SilkroadEmu\Debug\LoginServer.exe:致命错误LNK1120:1nichtaufgelösteexterneVerweise.
翻译成英文:
错误LNK2019:未解析的外部符号""public:void __thiscall PacketBuilder :: Append(unsigned char)"(?? $ Append @ E @ PacketBuilder @@ QAEXE @ Z)"in Function""public:void __thiscall Client :: DoHandshake(无效)"(?DoHandshake @ …