如果我有一个定义的结构,如下所示:
struct blank {
int : 0;
};
Run Code Online (Sandbox Code Playgroud)
编译器会在运行时将其优化为零吗?
我问,因为这个相当受欢迎的SO问题.我想在我自己的C/C++代码中使用类似的编译时检查.我正在尝试使程序尽可能最佳,所以如果我只是将它们用于编译时检查,我不希望这些空结构在运行时闲置.
另一方面,是否有一种C++ - 惯用的方式来实现与链接相同的结果?
我很好奇C#编译器如何处理下面的两个语句:
String text = "abcdefghijklmnopqrstuvwxyz";
text = text.Substring( 0, 15 );
text = text + "...";
Run Code Online (Sandbox Code Playgroud)
与
String text = "abcdefghijklmnopqrstuvwxyz";
text = text.Substring( 0, 15 ) + "...";
Run Code Online (Sandbox Code Playgroud)
结果当然是一样的,但是连接运算符在第二次设置中是否更好地优化了代码?
在两种情况下,您最终都会为堆栈上的字符串分配4个分配,或者第二种情况只分配3个分配?
在阅读一些代码时,我只是一个随机的问题.
我想更好地了解如何更改函数签名:
void foo(double x);
Run Code Online (Sandbox Code Playgroud)
至:
void foo(const double x);
Run Code Online (Sandbox Code Playgroud)
如果我们不修改x里面,可能会导致代表编译器的一些优化技巧.有人可以给我一个具体的具体例子吗?
在c#中,空的try catch块花费了多少时间?
我听说它介于10-55ms之间,但我倾向于零/一,因为编译器将用无操作占位符替换空try catch.
任何可以验证这些信息的编译专家?
我已经读过现代C++编译器将大块switch转换成二进制树以便在运行时更快地查找,这适用于所有现代C++编译器吗?我主要使用英特尔C++编译器和G ++.
请考虑方法:
private void FastMethod(string param)
{
}
private void SlowMethod<T>(Expression<Func<T>> expression)
{
}
Run Code Online (Sandbox Code Playgroud)
并进行以下测试:
[TestMethod]
public void Test()
{
var stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 1000000; i++)
{
this.FastMethod("TestContext");
}
TestContext.WriteLine("Fast time: " + stopwatch.ElapsedMilliseconds);
stopwatch.Restart();
for (int i = 0; i < 1000000; i++)
{
this.SlowMethod(() => this.TestContext);
}
TestContext.WriteLine("Slow time: " + stopwatch.ElapsedMilliseconds);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
快速时间:4
慢时间:2249
http://i.imgur.com/eYcBfZX.png
我知道这是每100万个电话,所以这看起来可能不是一个严重的性能问题.
但是我希望有一些基于属性设置器中的表达式的逻辑,它们将会经常调用+我只是好奇.
这里有优化空间吗?(我无法摆脱Expression方法参数,基本上我需要做一些语法树解析.有趣的是解析本身足够快).
所以我遇到了一个问题,即某段代码给了我这个错误*** BUFFER OVERFLOW DETECTED ***.一旦我打开某些编译器优化选项(这不是我的程序,所以我必须使用这些),这才开始发生.我把它缩小到了它的选择范围.我还找到了一种方法来阻止缓冲区溢出,但是,我在程序的另一部分中有非常相似的代码,当我保留它时不会给我相同的错误.这使我对我的修复非常困惑和非常不自信,所以一些指导将不胜感激.
以下是来自的优化选项 makefile
CXXFLAGS+=-Os -O2 -fomit-frame-pointer
CXXFLAGS+=-fno-aggressive-loop-optimizations
Run Code Online (Sandbox Code Playgroud)
我把它缩小到-O2开始导致错误的标志.
这是realpath()仅在-O2指定了标志时才在缓冲区溢出时失败的函数
static std::string getRealTargetPath (std::string baseTarget)
{
char nextTargetLink[MAXPATHLEN];
memset (nextTargetLink, 0, MAXPATHLEN);
if (realpath (baseTarget.c_str(), nextTargetLink) == NULL)
return "";
else
//etc...
}
Run Code Online (Sandbox Code Playgroud)
如果我将MAXPATHLEN(大小1024)更改为PATH_MAX(大小4096),则上述函数将按预期运行.好,可以.但是,以下代码片段在使用与 std::string baseTarget之前相同的代码后执行~20行.
char realLinkPath[MAXPATHLEN];
memset (realLinkPath, 0, MAXPATHLEN);
do
{
if (realpath (linkPath.c_str(), realLinkPath) != NULL)
if (strcmp(linkPath.c_str(), realLinkPath) != 0)
return true; …Run Code Online (Sandbox Code Playgroud) for (int i = 0; i < foo + bar; ++i)
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
假设这foo + bar是一个巨大的数字,并且它的值在循环迭代期间不会改变.(也就是说,循环的身体不会改变foo或bar)
foo + barget 的值是否缓存在某个地方?或者每次都会重新评估?
C/C++会不会处理它与Java等高级语言的不同?
假设我们Container维护了一组int值,并为每个值指示了该值是否有效.无效值被认为是INT_MAX.最初,所有值都无效.第一次访问值时,将其设置为INT_MAX并将其标志设置为有效.
struct Container {
int& operator[](int i) {
if (!isValid[i]) {
values[i] = INT_MAX; // (*)
isValid[i] = true; // (**)
}
return values[i];
}
std::vector<int> values;
std::vector<bool> isValid;
};
Run Code Online (Sandbox Code Playgroud)
现在,另一个线程同时读取容器值:
// This member is allowed to overestimate value i, but it must not underestimate it.
int Container::get(int i) {
return isValid[i] ? values[i] : INT_MAX;
}
Run Code Online (Sandbox Code Playgroud)
这是完全合法的代码,但是它行是至关重要的(*),并(**)在给定的顺序执行.
-O3,也不想使用volatile.如果我正在编写100%ANSI C但编译.cpp文件,编译器会自动"优化"malloc和免费调用new和delete吗?鉴于他们的差异,这甚至是否有意义?我不认为这是如何运作的,但我的一位朋友说这就是发生的事情.