为什么关于Qt库的官方示例和教程从不使用智能指针?我只看到new并delete创建和销毁小部件.
我搜索了理由但我找不到它,我自己也没有看到它,除非它是出于历史原因或向后兼容性:不是每个人都希望程序在窗口小部件构造函数失败时终止,并通过try/catch处理它块只是丑陋(即使在少数地方使用).父小工具可能取得孩子的所有权这一事实也只能部分地解释我的事情,因为你仍然需要delete在某种程度上为父母使用.
考虑以下代码:
template<class K>
class C {
struct P {};
vector<P> vec;
void f();
};
template<class K> void C<K>::f() {
typename vector<P>::iterator p = vec.begin();
}
Run Code Online (Sandbox Code Playgroud)
为什么此示例中需要"typename"关键字?是否还有其他必须指定"typename"的情况?
考虑支持默认移动语义的类型T. 还要考虑以下功能:
T f() {
T t;
return t;
}
T o = f();
Run Code Online (Sandbox Code Playgroud)
在旧的C++ 03中,一些非最佳编译器可能会调用两次复制构造函数,一个用于"返回对象",另一个用于o.
在c ++ 11中,由于tinside f()是左值,那些编译器可能像以前一样调用复制构造函数,然后调用o的移动构造函数.
是否正确说明避免第一次"额外复制"的唯一方法是t在返回时移动?
T f() {
T t;
return std::move(t);
}
Run Code Online (Sandbox Code Playgroud) std::vector::resize从前C++ 11 改变的原因是什么:
void resize( size_type count, T value = T() );
Run Code Online (Sandbox Code Playgroud)
到兼容的C++ 11表单:
void resize( size_type count );
void resize( size_type count, const value_type& value);
Run Code Online (Sandbox Code Playgroud) 我有一个程序和一个静态库:
// main.cpp
int main() {}
// mylib.cpp
#include <iostream>
struct S {
S() { std::cout << "Hello World\n";}
};
S s;
Run Code Online (Sandbox Code Playgroud)
我想将静态库(libmylib.a)链接到程序对象(main.o),虽然后者不直接使用前者的任何符号.
以下命令似乎不适合g++ 4.7.它们将在没有任何错误或警告的情况下运行,但显然libmylib.a不会链接:
g++ -o program main.o -Wl,--no-as-needed /path/to/libmylib.a
Run Code Online (Sandbox Code Playgroud)
要么
g++ -o program main.o -L/path/to/ -Wl,--no-as-needed -lmylib
Run Code Online (Sandbox Code Playgroud)
你有更好的想法吗?
我在我的x86 32位linux系统上构建了GCC 4.7.当我尝试使用-m64标志进行交叉编译时,我得到以下结果:
抱歉,未实现:64位模式未编译
而我的Linux发行版默认提供的编译器可以与-m64交叉编译.
我需要传递给./configure以在GCC中启用64位模式?这些是我用来构建GCC 4.7的选项:
$ /usr/local/bin/g++ -v Using built-in specs.
COLLECT_GCC=/usr/local/bin/g++
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/i686-pc-linux-gnu/4.7.0/lto-wrapper
Target: i686-pc-linux-gnu
Configured with: ./configure --enable-multiarch --with-cloog=/usr/local/ --with-mpfr=/usr/local/ --with-ppl=/usr/local/ --verbose --enable-languages=c,c++
Thread model: posix gcc version 4.7.0 20120113 (experimental) (GCC)
Run Code Online (Sandbox Code Playgroud)
编辑:
--enable-multilib和--enable-targets = i686-pc-linux-gnu,x86_64-pc-linux-gnu
不要改变这种情况.编译器仍抱怨未编译的64位模式:
$ g ++ -v使用内置规范.COLLECT_GCC = g ++ COLLECT_LTO_WRAPPER =/usr/local/libexec/gcc/i686-pc-linux-gnu/4.7.0/lto-wrapper目标:i686-pc-linux-gnu配置:./ configure --enable-multiarch - -with-cloog =/usr/local/--with-mpfr =/usr/local/--with-ppl =/usr/local/--verbose --enable-languages = c,c ++ --enable-multilib - -enable-targets = i686-pc-linux-gnu,x86_64-pc-linux-gnu线程模型:posix gcc版本4.7.0 20120113(实验)(GCC)
$ g ++ -m64 c.cpp c.cpp:1:0:抱歉,未实现:64位模式未编译
是noexcept函数说明旨在改善的可能,因为在生成的对象异常没有簿记代码的性能,因此应增加尽可能函数声明和定义?我首先考虑可调用对象的包装器noexcept,虽然检查表达式可能会"膨胀"源代码,但可能会有所不同.这值得吗?
考虑以下库,可以在任何程序执行之前预先加载:
// g++ -std=c++11 -shared -fPIC preload.cpp -o preload.so
// LD_PRELOAD=./preload.so <command>
#include <iostream>
struct Goodbye {
Goodbye() {std::cout << "Hello\n";}
~Goodbye() {std::cout << "Goodbye!\n";}
} goodbye;
Run Code Online (Sandbox Code Playgroud)
问题是,虽然goodbye总是调用全局变量的构造函数,但是没有为某些程序调用析构函数,例如ls:
$ LD_PRELOAD=./preload.so ls
Hello
Run Code Online (Sandbox Code Playgroud)
对于其他一些程序,析构函数按预期调用:
$ LD_PRELOAD=./preload.so man
Hello
What manual page do you want?
Goodbye!
Run Code Online (Sandbox Code Playgroud)
你能解释为什么在第一种情况下没有调用析构函数吗?编辑:上面的问题已经得到解答,那就是程序可能会使用_exit(),abort()来退出.
然而:
有没有办法在预加载的程序退出时强制调用给定的函数?
我想vector<char>用作缓冲区.该接口非常适合我的需求,但由于内存已初始化,因此在将其大小调整到超出当前大小时会有性能损失.我不需要初始化,因为在任何情况下,某些第三方C函数都会覆盖数据.有没有办法或特定的分配器来避免初始化步骤?请注意,我想使用resize(),没有其他的技巧,比如reserve()和capacity(),因为我需要size()总是代表我的"缓冲"在任何时刻的有意义的大小,同时capacity()可能会比以后它的尺寸更大resize(),所以,再一次,我可以不依赖capacity()作为我的申请的重要信息.此外,矢量的(新)大小事先不知道,所以我不能使用std::array.如果vector不能以这种方式配置,我想知道我可以使用哪种容器或分配器而不是vector<char, std::alloc>.唯一的要求是vector的替代方案最多必须基于STL或Boost.我可以访问C++ 11.
考虑从N3650获取的以下示例:
int cnt = 0;
do {
cnt = await streamR.read(512, buf);
if (cnt == 0)
break;
cnt = await streamW.write(cnt, buf);
} while (cnt > 0);
Run Code Online (Sandbox Code Playgroud)
我可能失去了一些东西,但如果我的理解async和await好,什么是显示了两个构建与当效果等同于书写上面的例子中的有用的点:
int cnt = 0;
do {
cnt = streamR.read(512, buf).get();
if (cnt == 0)
break;
cnt = streamW.write(cnt, buf).get();
} while (cnt > 0);
Run Code Online (Sandbox Code Playgroud)
其中,无论是read().get()和write().get()调用是同步的?