我在Windows上使用Code :: Blocks IDE和GCC/MinGW,我正在尝试构建一个wxWidgets应用程序,其中包含ca. 20k线和40个源模块.它构建非常慢.
编译C++模块持续2-5秒,链接持续2-3分钟.
它是一个可移植的代码,这段代码在Linux上编译速度非常快.我无法按照构建消息窗口...整个过程持续不到20秒.
我尝试了常见的调整(例如,预编译头,关闭优化等),但没有任何效果.
为什么这么慢?
浮点是在C中定义的实现.因此没有任何保证.
我们的代码需要是可移植的,我们正在讨论在我们的协议中使用IEEE754浮点数是否可以接受.出于性能原因,如果我们不必在发送或接收数据时在固定点格式之间来回转换,那将是很好的.
虽然我知道平台和架构之间可能存在关于long或的大小的差异wchar_t.但我似乎无法找到任何具体的float和double.
到目前为止我发现字节顺序可能在大端平台上被反转.虽然有不带浮动包含代码,其中点支撑平台float和double甚至无法链接.否则平台似乎坚持IEEE754单精度和双精度.
那么可以假设浮点数在IEEE754可用时安全吗?
编辑:回应评论:
你对"安全"的定义是什么?
安全我的意思是,一个系统上的位模式在另一个系统上意味着相同(在字节旋转之后处理字节序).
如何在Linux下使用C程序在X窗口中设置鼠标光标位置?谢谢:)(像WIN中的setcursorpos())
编辑:我已经尝试过这段代码,但不起作用:
#include <curses.h>
main(){
move(100, 100);
refresh();
}
Run Code Online (Sandbox Code Playgroud) C++旨在为程序员提供选择,即使这使程序员可以选择错误.
如果它是这样设计的,为什么没有标准的方法来强制编译器内联一些东西,即使我可能是错的?
或者我可以问为什么inline关键字只是一个提示?
我想我别无选择.
在OOP世界中,我们在对象上调用方法,并且应该避免直接访问成员.如果我们不能强制访问内联,那么我们就无法编写高性能但仍可维护的应用程序.
(我知道很多编译器都用自己的方式来强制内联,但它很难看.使用宏来创建类的内联访问器也很难看.)
编译器总是比程序员做得更好吗?
要复制多态类时的典型模式是添加一个虚拟克隆方法,并在每个派生类中实现它,如下所示:
Base* Derived::clone()
{
return new Derived(*this);
}
Run Code Online (Sandbox Code Playgroud)
然后,在调用代码中,您可以:
Base *x = new Derived();
Base *y = x->clone();
Run Code Online (Sandbox Code Playgroud)
但是,如果您有50多个派生类,并且意识到需要多态复制,那么将克隆方法复制粘贴到每个复制类中就很麻烦。从本质上讲,它是一个样板,可以解决语言限制,您必须拼出实际名称才能调用构造函数。
我没有跟踪最新的C ++标准中的新功能...在现代C ++中,有什么方法可以避免这种情况?
Valgrind将使用该track-origins=yes选项告诉您未初始化值的来源.
我试图压制这些警告,但问题是基于未初始化值的数据可以传播到任何地方,在其他地方也会发出警告.
解决方案将取决于未初始化数据的来源.我该怎么做?可能吗?似乎抑制文件只过滤堆栈跟踪.
我想要的原因是,OpenSSL通过故意使用未初始化的值来增强随机性,我想用valgrind测试发布版本(所以-DPURIFY不是一个选项).
可能重复:
为什么C++参数范围会影响命名空间中的函数查找?
今天我经历了这种奇怪的行为.我可以先调用strangeFn using namespace Strange,但不允许调用strangeFn2为什么?
namespace Strange
{
struct X
{
};
void strangeFn(X&) {}
void strangeFn2(int) {}
}
int main()
{
Strange::X x;
strangeFn(x); // GCC allows calling this function.
strangeFn2(0); // Error: strangeFn2 is not declared in this scope.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C++编译器如何解决符号的范围?
在php生成的页面上有几个这样的元素:
<td class="defaultTDStyle" style="color:userDefinedCustomColor" id="myTDId"></td>
Run Code Online (Sandbox Code Playgroud)
所以有一个默认样式,我应用了几个额外的样式,覆盖CSS中定义的样式.
有没有办法从JavaScript中删除这些添加的样式?似乎obj.style.color ="default"和obj.style.color ="auto"不起作用.如何从javascript将颜色重置为CSS默认值?
以下面的代码片段为例:
*pInt = 0xFFFF;
*pFloat = 5.0;
Run Code Online (Sandbox Code Playgroud)
由于他们是int和float指针,编译器将假定他们不这样做别名,例如可以交换.
现在让我们假设我们用这个来加强它:
*pInt = 0xFFFF;
*pChar = 'X';
*pFloat = 5.0;
Run Code Online (Sandbox Code Playgroud)
因为char*允许别名,它可能指向*pInt,所以赋值*pInt不能超出赋值*pChar,因为它可以合法地指向*pInt并将其第一个字节设置为'X'.类似地pChar可以指向*pFloat,*pFloat在char赋值之前不能移动赋值,因为代码可能打算通过重新分配来取消先前字节设置的效果*pFloat.
这是否意味着我可以通过编写和读取char*来为重新排列和其他严格的别名相关优化创建障碍?
如果你的共享库内部使用C++,那么std::它引用的所有模板和类型都将导出为弱符号。即使您使用-fvisiblity=hidden和-Wl,--exclude-libs,ALL. 隐藏这些符号的唯一方法是使用版本脚本。
这些强制出口的目的是什么?
用版本脚本隐藏它们有什么坏处吗?
c++ ×5
c ×3
linux ×2
codeblocks ×1
css ×1
dynamic-html ×1
gcc ×1
html ×1
ieee-754 ×1
inline-code ×1
javascript ×1
linker ×1
mingw ×1
namespaces ×1
performance ×1
pointers ×1
position ×1
scope ×1
standards ×1
valgrind ×1
x11 ×1