Hidden Features and Dark Corners of C++/STL

Posted by lazybugg at 2014-04-21 with tags C++


来自:Google groups comp.lang.c++


  1. when a temporary is assigned to a reference inside a {} block, it’s lifetime is extended to the lifetime of a reference.
#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	int & ra = a;
	{
		int t = 12;
		ra = t;
	}

	cout << ra << endl;
}
Top

Compile and install RESTBED in Ubuntu 12.04

Posted by lazybugg at 2014-04-11 with tags restbed

在Ubuntu 12.04 下编译安装restbed

restbed 是一个支持RESTful的C++库。编译它需要使用cmake >= 2.8.10,和 g++ >= 4.9。这两个条件在Ubuntu 12.04里都不满足。cmake和gcc都需要自己编译最新的。cmake比较容易编译,gcc4.9的编译请看我前一篇文章。它还依赖asio库,这个库Ubuntu 12.04的源里有,直接安装就行了。


我想把restbed安装到系统的/usr/目录里,这样编写的程序可以比较方便的使用它。所以在编译之前需要修改build/CMakeList.txt

修改 build/CMakeLists.txt 文件

  1. 第21行改为 set( CMAKE_INSTALL_PREFIX "/usr" )
  2. 第22行改为 set( LIBRARY_OUTPUT_PATH "${CMAKE_INSTALL_PREFIX}/lib" )
  3. 第60行改为 file( MAKE_DIRECTORY "${CMAKE_INSTALL_PREFIX}/lib" )

改完后进入build子目录,编译安装

sudo cmake . -DCMAKE_CXX_COMPILER=/opt/gcc_4_9/bin/g++-4.9
sudo make clean install

现在就安装好了。使用时包含头文件<restbed>,使用gcc编译时在最后加上编译选项-l restbed就OK了。

Top

Compile and install GCC-4.9 in Ubuntu 12.04

Posted by lazybugg at 2014-04-11 with tags GCC

在Ubuntu 12.04下编译安装GCC/G++4.9

做毕设使用的一个开源项目restbed使用g++4.9才能编译,4.9还没正式发布,Ubuntu 12.04没有预编译好的,无奈只好自己编译。


  • 下载最新的开发版GCC源代码
svn checkout svn://gcc.gnu.org/svn/gcc/trunk
  • 安装依赖
sudo apt-get install flex bison build-essential 

# 如果要支持multilib(即使编译出来的gcc可以编译32位和64位的程序),需要安装下面的依赖
sudo apt-get install gcc-multilib
#如果你现用的gcc编译器不是Ubuntu 12.04源里的4.6版本,比如我使用的是ppa里的4.8版本,上面的命令需要改成
sudo apt-get install gcc-4.8-multilib

# 在gcc源代码的根目录执行下面的命令,这会下载gmp, mpfr, mpc,并装它们的编译集成到GCC的编译过程中
./contrib/download_prerequisites 
  • 建立一个编译用的目录,在gcc源码的根目录下执行这个命令
mkdir build
cd build
  • 配置。假设想把这个gcc安装到 /opt/gcc_4_9/目录,示例配置如下,使用这个配置,编译出来的gcc支持编译C, C++两种语言。支持编译32位和64位程序
../configure --prefix=/opt/gcc_4_9 --program-suffix=-4.9 --enable-languages=c,c++ --enable-multilib --build=x86_64-linux-gnu --enable-checking=release 
  • 开始编译,-j4表示使用4个线程。在我的电脑上(intel i3)用了50多分钟。
make -j4
  • 安装与验证
make install

/opt/gcc_4_9/bin/g++-4.9 --version


我花了大半天时间才弄好。开始我根据网上的中文教程,自己下载编译gmp, mpfr, mpc。make的时候总是出错。后来再搜才搜到使用 download_prerequisites 的方法安装依赖。但是 flex 和 bison 的依赖还是要装的。

Top

smart pointer in C++11 (notes)

Posted by lazybugg at 2014-04-06 with tags C++, C++11

smart pointer in C++11 (notes)


auto c = make_shared<circle>(12);
auto ints = make_unique<int[]>(new int[10]);

// customize deleter
// wrap C pointer
auto stmt = make_shared<sqlite3_stmt>(nullptr, [](sqlite3_stmt * stmt){
	sqlite3_free(stmt);
	stmt = nullptr;
});

const char * sql_template = "delete from BOOK where book_id = '%s';";
size_t sql_length = std::strlen(sql_template) + sizeof(T);
std::unique_ptr<char[]> sql(new char[sql_length]);
std::snprintf(sql.get(), sql_length, sql_template, book_id.c_str());
Top

using std::stringstream

Posted by lazybugg at 2014-04-06 with tags C++, stringstream, io

一个stringstream的对象ss,当它的状态是eof(),就会一直在这个状态不能自拔,即使使用ss.str(new_string)也没用。所以在再次使用<<, >>之前要重置它的状态。


std::string line = "word1 word2 word3";
std::stringstream ss(line);
std::string word;

while(ss >> word){
	std::cout << word << std::endl;
}

line = "some other sentence";

// ss.str(line) 是将line的内容附加到ss原来的字符串后面,而不是替换它的内容。
ss.str("");	 // 先清空ss里可能剩余的字符
ss.str(line); 

// 恢复 ss 流的状态,上一步读结束后,它的状态很可能是EOF,
// 若不清空,接下来的读都不会成功
ss.clear();

while(ss >> word){
	std::cout << word << std::endl;
}

如何正确的使用 stringstream, iostream 等输入输出流,请参考C++ FAQ,它提供了不少示例代码。

http://isocpp.org/wiki/faq/input-output

Top

Modern C++: What You Need to Know

Posted by lazybugg at 2014-04-05 with tags Performance, C++


来自微软Build 2014演讲视频 Modern C++: What You Need to Know by Herb Sutter

地址:http://channel9.msdn.com/Events/Build/2014/2-661?format=html5

slide: http://video.ch9.ms/sessions/build/2014/2-661.pptx

视频:http://video.ch9.ms/sessions/build/2014/2-661_LG.mp4


局部性 与 vector

右边的代码比左边的快50倍。


vector, map, list 在中间做插入、删除的性能

linked list 慢的最主要原因是它只有顺序的查找插入/删除点。而vector可以用二分。

所以:

  • 默认使用 vector<T>
  • 需要查找的(dictionary lookup)使用 map<key,val>(tree-based)或者unordered_map<key,val>(hash-based)
  • 复杂度理论只是非常概略的指导。

这让我想到了另一个例子,它是stackoverflow C++标签下评分最高的问题,得了7497分(写这篇博客时)。这个问题是关于Branch Predication的,在《深入理解计算机系统》(Computer system: a programmer’s perspective)里有讲到。上面的局部性当然也讲了。

Why is processing a sorted array faster than an unsorted array?

Top