哪个C++编译器目前在Windows平台上有完整的 C++ 11支持?
Microsoft编译器目前没有完整的C++ 11支持(并且不会很快添加它).
MinGW g ++(来自mingw.org)不支持std::thread开箱即用.它也无法编译Qt 4源(在构建QtGuid4.dll时耗尽内存,已知的解决方法对我不起作用).
我已经浪费了好几天试图让Windows上的clang工作,设法编译它,但无法启用c ++ 11支持,因为它需要libstdc ++(我认为)当时没有移植到Windows平台.Qt 4也不支持它.
那里还有什么?我已经为C++ 03工作了很长时间,我想给新功能一个旋转,但我真的不想要一个不完全支持的工具(这会增加额外的头痛,同时写一个代码)或链接库时可能耗尽内存(在8GB系统上).
我正在使用Windows 7 64位,虽然有64位支持会很好,但我最感兴趣的是32位应用程序,因此生成64位可执行文件的能力是可选的.
有什么建议?
可能重复:
Haskell与现实世界中的程序编程
很少有人听到人们说"每个程序员都应该知道Haskell","如果你不了解haskell就不是程序员"等等.但是,我不确定我是否应该费心去尝试简短地理解这种语言.使用口译员(直观地了解基础知识)至少需要几天(如果不是几周),而且我不确定结果是否值得.
一点背景(了解我的知识)
我从小就开始编程(大概在10年或13年前),可编程计算器,移动到基本,然后到非x86汇编(重新复用乘法和除法,编写自修改鼠标驱动程序很有趣),pascal, delphi,现在我几乎完全使用C++.了解unix shell的方法,可以在python中编写软件,也可以在任何东西(如果我附近有参考书)中编写远程类似于C++或Pascal的软件(即块,类似的流控制等).专业化是3D编程和着色器."在水中钓鱼"具有低级操作(C风格的内存分配,指针),对于极度OOP方法不太熟悉(即,为了创建类而创建类).几乎完全是自学成才.我绝对不是新手,但有些地方我可以改进.
那么......在这一点上我可以从学习Haskell获得什么呢?据我所知,这种语言并没有被广泛使用,因此它可以与更少的库接口(就像Delphi编程一样 - 你可以在delphi中进行DirectX编程,如果你真的想要,但你可以用它来写3dsmax/maya插件(好吧,理论上可能是这样,但它肯定不容易)).我也不认为我能够轻松地将一段Haskell代码插入到游戏引擎中.
那么,我可以从中获得什么样的有用知识呢?
PS我不会买"如果你学习另一种语言,你可能会学到一些可能有用的东西"的论点.
题
如果我在Windows上使用clozure cl制作普通lisp(使用:lispbuilder-sdl,quicklisp,cffi)的2D游戏,我能否轻松将其移植到其他平台(linux/iPhone(也许)/ android)以后?lisp"适合"可安装的程序吗?
信息
推理
我真的,真的厌倦了C++.想要尝试更简单的语法+更强大的功能(不是python).记住一个游戏项目,想知道如果我突然决定稍后分发/移植游戏,是否为游戏选择lisp意味着严重的麻烦.
- 编辑 -
附加信息
"适当的"和"可安装的程序"是什么意思?
如果我尝试将可以在我的机器上运行的已完成程序转换为可安装程序包(例如,Windows上的Windows安装程序),我不确定CFFI/quicklisp将如何运行.例如,quicklisp在用户的主目录中设置路径/存储库(这可能是不可接受的行为)并尝试从外部源自动下载包,这在您尝试分发程序并确保其工作时不是一件好事意.CFFI在某些方面"绑定"外部库到lisp函数,并且我不清楚它是如何工作的,比如,如果我转储程序映像,将其嵌入到exe并在另一台机器上运行所述exe.根据常识,它应该可以正常工作,但在最坏的情况下,它可能导致我必须编写特定于lisp分发的复杂安装程序.
此代码在msvc/g ++上编译:
class A{
protected:
int i;
class B{
public:
A* a;
B(A* a_)
:a(a_){
}
void doSomething(){
if (a)
a->i = 0;//<---- this part
}
};
public:
A()
:i(0){
}
};
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,B可以访问封闭类的"受保护"部分,尽管它未被声明为朋友.
这是标准(符合标准)的行为吗?
我有时使用此功能,但我不记得规则说嵌套的受保护类应该自动访问封闭类的所有受保护数据.
问题.
Microsoft Visual C++ 2005编译器,32位windows xp sp3,amd 64 x2 cpu.
码:
double a = 3015.0;
double b = 0.00025298219406977296;
//*((unsigned __int64*)(&a)) == 0x40a78e0000000000
//*((unsigned __int64*)(&b)) == 0x3f30945640000000
double f = a/b;//3015/0.00025298219406977296;
Run Code Online (Sandbox Code Playgroud)
计算结果(即"f")是11917835.000000000(((unsigned __int64)(&f))== 0x4166bb4160000000)虽然它应该是11917834.814763514(即((unsigned __int64)(&f))== 0x4166bb415a128aef).
即分数部分丢失.
不幸的是,我需要小数部分才能正确.
问题:
1)为什么会发生这种情况?
2)我该如何解决这个问题?
附加信息:
0)结果直接来自"监视"窗口(它没有打印,我没有忘记设置打印精度).我还提供了浮点变量的十六进制转储,所以我对计算结果非常肯定.
1)f = a/b的反汇编是:
fld qword ptr [a]
fdiv qword ptr [b]
fstp qword ptr [f]
Run Code Online (Sandbox Code Playgroud)
2)f = 3015/0.00025298219406977296; 得到正确的结果(f == 11917834.814763514,((unsigned __int64)(&f))== 0x4166bb415a128aef),但看起来在这种情况下,结果只是在编译时计算:
fld qword ptr [__real@4166bb415a128aef (828EA0h)]
fstp …Run Code Online (Sandbox Code Playgroud) 假设有以下目录结构:
root
|
+--projects
| |
| +-test
| |
| +-CMakeFiles.txt
|
+--libs
|
+-testlib
|
+-CMakeFiles.txt
Run Code Online (Sandbox Code Playgroud)
test包含CMakeFiles.txt并testlib包含CMakeFiles.txt."test"生成可执行文件,"testlib"生成静态库.
我希望"test"与"testlib"链接,而不使用符号链接,也不需要将"testlib"库移动到"test"中的子目录中.
因为"testlib"不是"test"的子目录,所以我不能这样做
add_subdirectory("../../libs/testlib")
Run Code Online (Sandbox Code Playgroud)
在测试中CMakeFiles.txt- CMake会抱怨"testlib"不在"test"子目录中.
另外,因为系统有几个不同的编译器,我不能简单地将"testlib"库安装到某种中心目录中,所以我想test编译一个本地副本testlib并与之链接(即好像testlib是一个子目录).我还希望"test"项目能够自动重建"testlib"(如果已经更改).
那么,我该如何处理呢?我在Windows XP SP3上使用CMake 2.8.4.
简短的问题.
我只是得到了一个我应该与之接口的DLL.Dll使用来自msvcr90D.dll的crt(注意D),并返回std :: strings,std :: lists和boost :: shared_ptr.操作员new/delete不会在任何地方超载.
我假设crt mixup(发布版本中的msvcr90.dll,或者如果其中一个组件使用较新的crt重建等)最终会导致问题,并且应该重写dll以避免返回任何可能调用new/delete的内容(即任何可以在我的代码中调用删除在dll中分配的内存块(可能使用不同的crt)的任何内容).
我是对还是不对?
这不是作业.
我正在使用一个小的"优先级队列"(目前实现为数组)来存储具有最小值的最后N个项目.这有点慢 - O(N)项目插入时间.当前实现跟踪数组中的最大项并丢弃任何不适合数组的项,但我仍希望进一步减少操作数.
寻找符合以下要求的优先级队列算法:
我最初考虑使用二进制堆(它们可以通过数组轻松实现),但显然当数组不能再增长时它们表现不佳.链接列表和数组将需要额外的时间来移动东西.stl优先级队列增长并使用动态分配(尽管我可能错了).
那么,还有其他想法吗?
--EDIT--
我对STL实现不感兴趣.由于大量的函数调用,STL实现(由少数人建议)比当前使用的线性阵列慢一点.
我对优先级队列算法感兴趣,而不是实现.
我想制作"压缩数组"/"压缩矢量"类(详见下文),它允许随机数据访问具有或多或少的恒定时间.
"或多或少的恒定时间"意味着虽然元素访问时间不是恒定的,但是当我接近数组的某个点时它不应该继续增加.即容器不应该做更多的计算(比如"再次解压缩所有内容以获取最后一个元素",并且"几乎不做任何事情来获得第一个")来获得一个元素.可以通过将数组拆分为压缩数据块来实现.即访问一个元素应该采用"averageTime"+ - 一些偏差.我可以说我希望最佳访问时间和最坏情况访问时间相对接近平均访问时间.
我有哪些选择(合适的算法/已有的容器 - 如果有的话)?
货柜详情:
用法示例:
对数据进行二进制搜索.
数据详情:
1.数据结构主要由浮点数和几个整数组成.浮点数多于整数.没有字符串.
2.阵列中不太可能存在许多相同的元素,因此无法简单地索引数据.
3.一个元素的大小小于100个字节.
4.每个容器的总数据大小介于几千字节和几兆字节之间.
5.数据不稀疏 - 它是连续的元素块,所有元素都被分配,没有"空槽".
压缩的目标是减少与未压缩表示形式相比较的块所占用的ram量,同时保持一定程度上合理的读取访问性能,并允许随机访问元素作为数组.即数据应该在内部以压缩形式存储,我应该能够访问它(只读),就像它是std :: vector或类似的容器一样.
想法/意见?
在常见的lisp中,管理外部资源(套接字,文件系统句柄等)的首选方法是什么?
我试图在常见的lisp中制作一个简单的opengl 2d平台游戏.问题是我不太确定如何跟踪OpenGL纹理(必须在glDeleteTextures不再需要时删除它们).
在C++中,我更喜欢使用以下方案:
但是,我不太确定如何将此方案移植到常见的lisp,因为:
(with-*那里看起来不合适,因为资源可以在函数调用的中间共享和加载/卸载.据我所知,有几种方法可用:
使用宏实现类似于C++ RAII,weakpointer和smartpointer的东西(这段代码可能不起作用):
(defclass destructible () ())
(defmethod destroy ((obj destructible)) (print (format nil "destroy: ~A" obj)))
(defparameter *destructible-classes-list* nil)
(defmethod initialize-instance :after ((obj destructible) &key)
(progn
(push *destructible-classes-list* obj)
(print (format nil "init-instance: ~A" obj))))
(defmacro with-cleanup (&rest body)
`(let ((*destructible-classes-list* nil))
(progn ,@body (mapcar (lambda (x) (destroy x)) *destructible-classes-list*))))
(defclass refdata (destructible)
((value :accessor refdata-value :initform nil)
(ref :accessor refdata-ref :initform …Run Code Online (Sandbox Code Playgroud)