我想用std::regex(标准正则表达式库)编译一个小的C++程序.
编译器:Fedora 21上的gcc/g ++ 4.9.2.
#include <string.h>
#include <iostream>
#include <regex>
using namespace std;
int main () {
cout << "Content-Type: text/html\n\n";
std::string s ("there is a subsequence in the string\n");
std::regex e ("\\b(sub)([^ ]*)"); // matches words beginning by "sub"
std::cout << std::regex_replace (s,e,"sub-$2");
}
Run Code Online (Sandbox Code Playgroud)
没有编译程序是std::regex不可能的-std=c++11,所以在终端编译的合适指令是:
g++ -std=c++11 code.cpp -o prog
Run Code Online (Sandbox Code Playgroud)
我的主要问题是:源代码非常小,但为什么编译程序的最终文件大小如此之大:480千字节?
是因为受到影响-std=c++11吗?
发生了什么,如何减少最终二进制程序的大小?
UPD1.
使用-Os标志实际上是将std :: regex从480 KB减少到100-120 KB的程序大小的好方法.但奇怪的是,甚至使用std :: regexp优化文件比使用少量字符串源代码的C/C++程序更符合7-12 kylobytes.例如,可以在8.5 KB二进制文件中使用RE2 regexp库(在Fedora 21"yum install re2-devel"中)转换相同的正则表达式替换技巧:
#include <string.h>
#include …Run Code Online (Sandbox Code Playgroud) OpenGL ES着色语言的文档(第5.11节)指出向量和矩阵乘法运算以正确的线性代数方式执行.线性代数教导我们如果我们将矩阵乘以向量,我们得到这样的结果:
1.0 1.0 0.0 -1.0 (1.0*-1.0)+(1.0*0.0)+(0.0*0.0)=-1.0
0.5 0.0 0.0 * 0.0 = (0.5*-1.0)+(0.0*0.0)+(0.0*0.0)=-0.5
0.0 0.0 0.0 0.0 (0.0*-1.0)+(0.0*0.0)+(0.0*0.0)= 0.0
1.0 1.0 0.0 0.0 1.0
0.5 0.0 0.0 * 1.0 = 0.0
0.0 0.0 0.0 0.0 0.0
1.0 1.0 0.0 1.0 1.0
0.5 0.0 0.0 * 0.0 = 0.5
0.0 0.0 0.0 0.0 0.0
Run Code Online (Sandbox Code Playgroud)
但是当我在WebGL顶点着色器中使用这个数学知识用于矢量乘法矩阵时,我面临着问题.当我尝试乘以上述矩阵的模拟时:
mat4 matrix=mat4(
1.0, 1.0, 0.0, 0.0,
0.5, 0.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
Run Code Online (Sandbox Code Playgroud)
三个垂直:红色(x = -1,y = 0,z = …