小编Mag*_*off的帖子

哪个(如果有的话)C++编译器会进行尾递归优化?

在我看来,在C和C++中进行尾递归优化是完美的,但是在调试时我似乎永远不会看到表示此优化的帧堆栈.这有点好,因为堆栈告诉我递归的深度.但是,优化也会很好.

是否有任何C++编译器进行此优化?为什么?为什么不?

我如何告诉编译器这样做?

  • 对于MSVC:/O2/Ox
  • 对于海湾合作委员会:-O2-O3

如何在某种情况下检查编译器是否已完成此操作?

  • 对于MSVC,启用PDB输出以跟踪代码,然后检查代码
  • 对于GCC ..?

我仍然会建议如何确定编译器是否对某个函数进行了优化(尽管我发现它让人放心,Konrad告诉我假设它)

总是可以通过进行无限递归来检查编译器是否完成此操作,并检查它是否导致无限循环或堆栈溢出(我用GCC做了这个并且发现这-O2已经足够了),但我想成为能够检查我知道的某个功能无论如何都会终止.我很想有一个简单的方法来检查这个:)


经过一些测试,我发现析构函数破坏了进行优化的可能性.有时可能值得更改某些变量和临时值的范围,以确保它们在return语句开始之前超出范围.

如果在尾调用后需要运行任何析构函数,则无法进行尾调用优化.

c++ optimization tail-recursion

144
推荐指数
5
解决办法
4万
查看次数

在C++ 11 lambda中通过引用捕获引用

考虑一下:

#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返回后最终会有一个悬空引用,或者只要原始引用的对象仍然存在,捕获的引用是否可以保证工作?

在这里寻找明确的基于标准的答案:) 到目前为止它在实践中运作良好;)

c++ lambda language-lawyer c++11

59
推荐指数
2
解决办法
2万
查看次数

用于多级指针解引用?

什么时候使用任何语言的指针要求有人使用多个指针,让我们说一个三指针.什么时候使用三指针而不是只使用常规指针是有意义的?

例如:

char  * * *ptr;
Run Code Online (Sandbox Code Playgroud)

代替

char *ptr;
Run Code Online (Sandbox Code Playgroud)

c++ pointers

42
推荐指数
4
解决办法
2万
查看次数

如何获取WiFi网络接口的MAC地址?

似乎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中有一个我可以阅读的文件吗?

必须有一种获取此地址的方法,因为它显示在手机的"设置>关于手机>状态"中.

java linux macos networking android

39
推荐指数
3
解决办法
5万
查看次数

Python是从数据库中存储和检索密码的最安全的方法

希望将用户名和密码存储在数据库中,并且想知道最安全的方法是什么.我知道我必须在某处使用盐,但我不确定如何安全地生成它或如何应用它来加密密码.一些示例Python代码将不胜感激.谢谢.

python encryption passwords password-protection

31
推荐指数
3
解决办法
5万
查看次数

如何在GCC中弃用已弃用的函数中删除已弃用的警告?

实现弃用警告的一种方法是在调用已弃用的函数时生成警告,除非您从已弃用的上下文中调用.这样,遗留代码可以调用遗留代码,而不会产生仅相当于噪声的警告.

这是一个合理的思路,它反映在我在OS X上的GCC 4.2(1)和Clang 4.0(2)以及Ubuntu上的Clang 3.0(3)中看到的实现中.

  • (1):i686-apple-darwin11-llvm-g ++ - 4.2(GCC)4.2.1(基于Apple Inc. build 5658)(LLVM build 2336.11.00)
  • (2):Apple clang 4.0版(标签/ Apple/clang-421.0.57)(基于LLVM 3.1svn)
  • (3):Ubuntu clang版本3.0-6ubuntu3(标签/ RELEASE_30/final)(基于LLVM 3.0)

但是,当我在Ubuntu上使用GCC 4.6(4)进行编译时,我对所有已弃用函数的调用都会被弃用警告,而与上下文无关.这是功能的回归吗?是否有可用于获取其他行为的编译器选项?

  • (4):g ++(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3

示例程序:

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)

c++ gcc deprecated gcc-warning

31
推荐指数
3
解决办法
5万
查看次数

C++ 11使用<atomic>实现Spinlock

我实现了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万.我在这里错过了什么?

c++ multithreading c++11

30
推荐指数
2
解决办法
3万
查看次数

GWT - 浏览器窗口调整大小的处理程序

我正在开发一个在画布上呈现文本的GWT应用程序.我想在调整浏览器窗口大小时调整画布大小.问题是如果我使用Window.addResizeHandler,每次调整大小的渲染过程都会非常慢.因此,只有当用户在完成调整大小后释放鼠标按钮时,我才需要一种方法来调整画布大小.反正有吗?

gwt

15
推荐指数
1
解决办法
2万
查看次数

clang/clang ++在Windows中找不到C/C++头文件?

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)

c c++ llvm clang mingw-w64

15
推荐指数
1
解决办法
1万
查看次数

用于从const映射中读取的惯用C++

对于std::map<std::string, std::string> variables,我想这样做:

BOOST_CHECK_EQUAL(variables["a"], "b");
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,在这种情况下variablesconst,所以operator[]不会工作:(

现在,有几种解决方法; 扔掉const,使用variables.count("a") ? variables.find("a")->second : std::string()甚至制作包裹它的功能.在我看来,这些都不如同operator[].我该怎么办?有没有一种标准的方法(漂亮)?

编辑:只是说出你们没有想要给出的答案:不,在C++中没有方便,美观,标准的方法.我将不得不实现一个支持功能.

c++ stl

14
推荐指数
4
解决办法
6925
查看次数