我在我的应用程序中广泛使用3D数学.通过将矢量/矩阵库转换为SSE,AltiVec或类似的SIMD代码,我可以实现多少加速?
我玩在线游戏"魔兽世界",它受到自动机器人的困扰,这些机器人检查游戏分配的内存,以便读取游戏/玩家/世界状态信息,用于机械地玩游戏.他们有时也直接写入游戏的记忆本身,但据我所知,更复杂的记忆本身并没有.
该游戏的供应商暴雪娱乐有一个名为Warden的独立应用程序,它应该检测和禁用这样的黑客和作弊,但它并不能捕捉到一切.
是否有可能创建一个Windows应用程序,在这个应用程序中,您是唯一可以读取您已读入内存的内容的应用程序?
在数百万台机器上运行的大型C++应用程序上实现是否务实?
有时使用复杂的头结构会出现一些标题,但很难分辨出来.
是否有一些工具(依赖性查看器?)或方法如何找到"包含堆栈"(哪个源/哪个标题/哪个标题/ ...)包含一个特定的头文件?
如果多次包含头文件,找到第一个包含就足够了,找到所有包含是一个值得欢迎的奖励.
当我们在Scala中使用Future时,我想知道onComplete和foreach之间的区别.
f onComplete (_ => doSomething(_))
和
f foreach (_ => doSomething(_))
上面的代码行会导致相同的结果吗?
如果我想在完成之后再做一些未来的事情.我该怎么办?我应该像这样使用isCompleted:
if(f.isCompleted) f onComplete (_ => doSomething(_))
非常感谢你们
考虑这种情况:
dll = LoadDLL()
dll->do()
...
void do() {
char *a = malloc(1024);
}
...
UnloadDLL(dll);
Run Code Online (Sandbox Code Playgroud)
此时,在调用malloc()时分配的1k是否可以再次用于主机进程?DLL静态链接到CRT.
在调试时,有时您需要附加已经运行的进程,而不是仅在调试器中启动应用程序.
我自己常常放入Sleep()或MessageBox调用,以便更容易连接调试器.我担心其中一些可能最终会被提交给源代码控制.
在延迟足够时间的同时避免这种情况的最佳方法是什么,以便可以将调试器连接到正在运行的进程?
用#ifdef _DEBUG一种方式保护睡眠或消息框,但我想知道是否有更好的方法.
睡眠时,您还有一个问题,即您可能无法及时附着.使用MessageBox,您可能遇到远程调试或调试没有可见GUI的进程的问题(示例在Vista上作为服务运行)
以下代码是否合法C++?
class Foo
{
class Bar;
void HaveADrink(Bar &bar);
void PayForDrinks(Bar &bar);
public:
void VisitABar(int drinks);
};
class Foo::Bar
{
public:
int countDrinks;
};
void Foo::HaveADrink(Bar &bar)
{
bar.countDrinks++;
}
void Foo::PayForDrinks(Bar &bar)
{
bar.countDrinks = 0;
}
void Foo::VisitABar(int drinks)
{
Bar bar;
for (int i=0; i<drinks; i++) HaveADrink(bar);
PayForDrinks(bar);
}
Run Code Online (Sandbox Code Playgroud)
Visual C++和GCC都接受它,但是代码对我来说似乎有些奇怪,我不愿意让它被未来的编译器拒绝.
尽管如此,这种模式似乎对减少编译时依赖性很有用 - 我经常使用它来声明用于传递一些"上下文"(一堆变量)的结构,这些结构在一些函数之间共享,这些函数都位于同一个cpp中文件,这样我就不必将"上下文"定义引入公共接口.
我想将我的应用程序切换到LARGEADDRESSAWARE.需要注意的一个问题是指针算法,因为指针差异不能再表示为带符号32b.
有没有办法如何在大型C++项目中自动查找指针减法的所有实例?
如果没有,是否有一些"尽力而为"的手动或半自动方法如何实现这一目标?
我有以下情况:有一大堆模板std::vector会调用memmove()移动数组的部分.有时他们会想要"移动"长度为零的部分 - 例如,如果删除了数组尾部(例如std::vector::erase()),他们将希望移动数组的其余部分,这些部分的长度为零,并且零将在编译时(我看到反汇编 - 编译器知道)但编译器仍会发出memmove()调用.
所以基本上我可以有一个包装器:
inline void callMemmove( void* dest, const void* source, size_t count )
{
if( count > 0 ) {
memmove( dest, source, count );
}
}
Run Code Online (Sandbox Code Playgroud)
但这会引入一个额外的运行时检查,count在编译时不知道我不想要的情况.
是否有可能使用__assume提示向编译器指示如果它确定count为零则应该消除memmove()?
在我的Scala代码中,我有一些隐式转换,我有必要的导入存在:
import scala.language.implicitConversions
Run Code Online (Sandbox Code Playgroud)
但是,有时当在此之后再进行另一次导入时,我会收到警告,好像导入根本不存在:
警告:(112,18)隐式转换方法pair2Dimension应该通过使隐式值scala.language.implicitConversions可见来启用.
build.sbt:
name := "ImplicitSBT"
version := "1.0"
scalaVersion := "2.11.5"
scalacOptions ++= Seq("-deprecation","-feature")
libraryDependencies += "org.scala-lang.modules" %% "scala-swing" % "1.0.1"
Run Code Online (Sandbox Code Playgroud)
Main.scala:
import scala.language.implicitConversions
import scala.swing.{Action, _}
object Main extends App {
implicit def pair2Dimension(pair: (Int, Int)): Dimension = new Dimension(pair._1, pair._2)
val dim : Dimension = (0,0)
println(dim)
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?如何import scala.swing.{Action, _}隐藏implicitConversions导入?
c++ ×7
optimization ×2
scala ×2
visual-c++ ×2
winapi ×2
c ×1
concurrency ×1
crt ×1
debugbreak ×1
debugging ×1
definition ×1
dll ×1
foreach ×1
future ×1
header ×1
import ×1
include ×1
native ×1
pointers ×1
security ×1
simd ×1
sse ×1
warnings ×1
x86 ×1