在我看来,在C和C++中进行尾递归优化是完美的,但是在调试时我似乎永远不会看到表示此优化的帧堆栈.这有点好,因为堆栈告诉我递归的深度.但是,优化也会很好.
是否有任何C++编译器进行此优化?为什么?为什么不?
我如何告诉编译器这样做?
/O2或/Ox-O2或-O3如何在某种情况下检查编译器是否已完成此操作?
我仍然会建议如何确定编译器是否对某个函数进行了优化(尽管我发现它让人放心,Konrad告诉我假设它)
总是可以通过进行无限递归来检查编译器是否完成此操作,并检查它是否导致无限循环或堆栈溢出(我用GCC做了这个并且发现这-O2已经足够了),但我想成为能够检查我知道的某个功能无论如何都会终止.我很想有一个简单的方法来检查这个:)
经过一些测试,我发现析构函数破坏了进行优化的可能性.有时可能值得更改某些变量和临时值的范围,以确保它们在return语句开始之前超出范围.
如果在尾调用后需要运行任何析构函数,则无法进行尾调用优化.
考虑一下:
#include <functional>
#include <iostream>
std::function<void()> make_function(int& x) {
return [&]{ std::cout << x << std::endl; };
}
int main() {
int i = 3;
auto f = make_function(i);
i = 5;
f();
}
Run Code Online (Sandbox Code Playgroud)
是否保证在5不调用未定义行为的情况下输出该程序?
我理解如果我x通过value([=])捕获它是如何工作的,但我不确定我是否通过引用捕获它来调用未定义的行为.可能是我在make_function返回后最终会有一个悬空引用,或者只要原始引用的对象仍然存在,捕获的引用是否可以保证工作?
在这里寻找明确的基于标准的答案:) 到目前为止它在实践中运作良好;)
什么时候使用任何语言的指针要求有人使用多个指针,让我们说一个三指针.什么时候使用三指针而不是只使用常规指针是有意义的?
例如:
char * * *ptr;
Run Code Online (Sandbox Code Playgroud)
代替
char *ptr;
Run Code Online (Sandbox Code Playgroud) 似乎android的java.net.NetworkInterface实现没有
byte [] getHardwareAddress()方法
http://developer.android.com/reference/java/net/NetworkInterface.html
我发现有几个人试图做这个没有确定答案的论坛,我需要得到一个有点跨设备的UUID,所以我不能依赖电话号码或ANDROID_ID(可以覆盖,我认为取决于对于拥有Google帐户的用户) http://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID
在linux中,您可以使用ifconfig或从/ proc/net/arp读取,您可以轻松获取硬件地址.
android中有一个我可以阅读的文件吗?
必须有一种获取此地址的方法,因为它显示在手机的"设置>关于手机>状态"中.
希望将用户名和密码存储在数据库中,并且想知道最安全的方法是什么.我知道我必须在某处使用盐,但我不确定如何安全地生成它或如何应用它来加密密码.一些示例Python代码将不胜感激.谢谢.
实现弃用警告的一种方法是在调用已弃用的函数时生成警告,除非您从已弃用的上下文中调用.这样,遗留代码可以调用遗留代码,而不会产生仅相当于噪声的警告.
这是一个合理的思路,它反映在我在OS X上的GCC 4.2(1)和Clang 4.0(2)以及Ubuntu上的Clang 3.0(3)中看到的实现中.
但是,当我在Ubuntu上使用GCC 4.6(4)进行编译时,我对所有已弃用函数的调用都会被弃用警告,而与上下文无关.这是功能的回归吗?是否有可用于获取其他行为的编译器选项?
示例程序:
int __attribute__((deprecated)) a() {
return 10;
}
int __attribute__((deprecated)) b() {
return a() * 2; //< I want to get rid of warnings from this line
}
int main() {
return b(); //< I expect a warning on this line only
}
Run Code Online (Sandbox Code Playgroud)
GCC 4.2的输出(是的,我确实得到了两次相同的警告.但我并不关心这一点):
main.cpp: In function ‘int main()’:
main.cpp:10: …Run Code Online (Sandbox Code Playgroud) 我实现了SpinLock类,如下所示
struct Node {
int number;
std::atomic_bool latch;
void add() {
lock();
number++;
unlock();
}
void lock() {
bool unlatched = false;
while(!latch.compare_exchange_weak(unlatched, true, std::memory_order_acquire));
}
void unlock() {
latch.store(false , std::memory_order_release);
}
};
Run Code Online (Sandbox Code Playgroud)
我实现了上面的类,并创建了两个线程,每个线程调用一个相同的Node类实例的add()方法1000万次.
不幸的是,结果不是2000万.我在这里错过了什么?
我正在开发一个在画布上呈现文本的GWT应用程序.我想在调整浏览器窗口大小时调整画布大小.问题是如果我使用Window.addResizeHandler,每次调整大小的渲染过程都会非常慢.因此,只有当用户在完成调整大小后释放鼠标按钮时,我才需要一种方法来调整画布大小.反正有吗?
1小时前我从http://llvm.org/pre-releases/3.6.0/下载了llvm-3.6.0-rc4-win32.exe .
我试图编译只打印"hello"的简单C代码,但它没有编译,因为clang.exe找不到stdio.h.当我使用clang-cl.exe和相同的代码时,它工作.
我对clang ++也有同样的问题,即使使用iostream,我将-I标志添加到GCC(4.9.1)C++头文件,结果如下:
C:\Users\One\Desktop>clang++ -I c:\MinGW\x86_64-w64-mingw32\include\c++ main.cpp -lib=libstdc++
In file included from main.cpp:1:
c:\MinGW\x86_64-w64-mingw32\include\c++\iostream:38:10: fatal error:'bits/c++config.h' file not found
#include <bits/c++config.h>
1 error generated.
Run Code Online (Sandbox Code Playgroud)
有人知道怎么修这个东西吗 ?
编辑: 我在MinGW文件夹中找到bits/c ++ config.h我将它添加到-I标志和其他.
我导致链接错误:
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/4.9.1/../../../../x86_64-w64-mingw32/
bin/ld.exe: cannot find -lib=libstdc++
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/4.9.1/../../../../x86_64-w64-mingw32/
bin/ld.exe: skipping incompatible C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/4.9
.1//libstdc++.dll.a when searching for -lstdc++
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/4.9.1/../../../../x86_64-w64-mingw32/
bin/ld.exe: skipping incompatible C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/4.9
.1//libstdc++.a when searching for -lstdc++
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/4.9.1/../../../../x86_64-w64-mingw32/
bin/ld.exe: skipping incompatible C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/4.9
.1/\libstdc++.a when searching for -lstdc++
C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/4.9.1/../../../../x86_64-w64-mingw32/
bin/ld.exe: skipping incompatible C:/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/4.9
.1/libstdc++.dll.a when searching for -lstdc++ …Run Code Online (Sandbox Code Playgroud) 对于std::map<std::string, std::string> variables,我想这样做:
BOOST_CHECK_EQUAL(variables["a"], "b");
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,在这种情况下variables是const,所以operator[]不会工作:(
现在,有几种解决方法; 扔掉const,使用variables.count("a") ? variables.find("a")->second : std::string()甚至制作包裹它的功能.在我看来,这些都不如同operator[].我该怎么办?有没有一种标准的方法(漂亮)?
编辑:只是说出你们没有想要给出的答案:不,在C++中没有方便,美观,标准的方法.我将不得不实现一个支持功能.
c++ ×7
c++11 ×2
android ×1
c ×1
clang ×1
deprecated ×1
encryption ×1
gcc ×1
gcc-warning ×1
gwt ×1
java ×1
lambda ×1
linux ×1
llvm ×1
macos ×1
mingw-w64 ×1
networking ×1
optimization ×1
passwords ×1
pointers ×1
python ×1
stl ×1