出于黑客的好奇心,我想知道如何gcc能够巧妙地优化这个功能?
int c() {
int i, j = 0;
for (i = 0; i < 10; i++) {
j += i;
}
return j;
}
Run Code Online (Sandbox Code Playgroud)
$objdump -D c.o 下面是针对arm但x86在逻辑上没有区别.
00000000 <c>:
0: 202d movs r0, #45 ; 0x2d
2: 4770 bx lr
Run Code Online (Sandbox Code Playgroud)
我大多想知道这是否是一系列优化或类似模板匹配的结果?有没有关于此类优化的文档?
我正在用 c++ 编写项目,并且在 cmake 中导入库时遇到问题。正在导入的第三方库不会传播包含目录。
根目录/CMakeLists.txt
# Top level CMakeLists.txt
cmake_minimum_required(VERSION 3.9.2 FATAL_ERROR)
project(camera_calib)
add_subdirectory(${PROJECT_SOURCE_DIR}/nana)
file(GLOB SRC "${PROJECT_SOURCE_DIR}/src/*.cpp")
add_executable(camera_calib_exe ${SRC})
target_include_directories(camera_calib_exe PRIVATE ${PROJECT_SOURCE_DIR}/include)
target_link_libraries(camera_calib_exe nana_lib)
Run Code Online (Sandbox Code Playgroud)
/nana/CMakeLists.txt
# nana c++ gui CMakeLists.txt
cmake_minimum_required(VERSION 3.9.2 FATAL_ERROR)
project(nana VERSION 1.5.6 LANGUAGES CXX)
add_library(nana_lib STATIC IMPORTED)
set_property(TARGET nana_lib PROPERTY IMPORTED_IMPLIB_DEBUG ${PROJECT_SOURCE_DIR}/lib/nana_v141_Debug_x64.lib)
set_property(TARGET nana_lib PROPERTY IMPORTED_IMPLIB_RELEASE ${PROJECT_SOURCE_DIR}/lib/nana_v141_Release_x64.lib)
set_property(TARGET nana_lib PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR}/include)
#set_property(TARGET nana_lib PROPERTY INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR}/include)
Run Code Online (Sandbox Code Playgroud)
代码示例/src/main.cpp
#include <nana/gui.hpp>
#include <nana/gui/widgets/label.hpp>
#include <nana/gui/widgets/button.hpp>
int main(int argc, char** argv)
{
nana::form fm(nana::rectangle(0, 0, 1900, 1000)); …Run Code Online (Sandbox Code Playgroud) 对于C++中的GUI编程,我们可以选择太多的库,例如Qt,Gtkmm,wxWidgets,FLTK,还有另一个已经存在的库:Nana.
Nana C++库使用现代C++(C++ 11)语言功能,如lambdas,模板等,它似乎与C++标准库兼容.
如果GUI库与C++标准库100%兼容,那么为什么我们不能将它用于下一个C++标准(C++ 14或C++ 17)?
库在C++标准库中需要哪些条件?如果条件没有定义,那么我们永远注定要陷入文本的黑洞,它会伤害你的心!否则,如果定义了条件,那么我在哪里可以请求库在下一个C++标准中?
在他们的网页上,Nana GUI人员给出了这个例子:
#include<nana/gui.hpp>
int main()
{
using namespace nana;
form fm;
drawing{fm}.draw([](paint::graphics& graph){
graph.string({10, 10}, L"Hello, world!", colors::red);
});
fm.events().click(API::exit);
fm.show();
exec();
}
Run Code Online (Sandbox Code Playgroud)
在开始的行中使用的C++特性是什么:drawing {fm} .draw ...
我从来没有见过这样的用法.
我写过这个从文本文件中读取一些数字的小解析器.
data.resize(7,datapoints); //Eigen::Matrix<float,7,-1> & data
dst = data.data();
while( fgets(buf,255,fp) != 0 && i/7 < datapoints)
{
int n = sscanf(buf,"%f \t%f \t%f \t%f \t%f \t%f \t%f",dst+i++, dst+i++,dst+i++,dst+i++,dst+i++,dst+i++,dst+i++);
i = i - 7 * (n<=0);
}
fclose(fp);
return !(datapoints == i/7);
Run Code Online (Sandbox Code Playgroud)
问题是,当我对数据执行std :: cout时,它会翻转.
数据在:
0 4 0.35763609 0.64077979 0 0 1
0 4 0.36267641 0.68243247 1 0 2
0 4 0.37477320 0.72945964 2 1 3
Run Code Online (Sandbox Code Playgroud)
data.col(3)是
0.64077979
0.68243247
0.72945964
Run Code Online (Sandbox Code Playgroud)
和data.col(4)是
0.35763609
0.36267641
0.37477320
Run Code Online (Sandbox Code Playgroud)
我无法看到为什么它将数据水平翻转的逻辑?
我想一个比较string例如"Tedt2.csv"到&value这是LPWSTR在函数的声明.这是我的基本代码:
PWSTR value = nullptr;
HRESULT hr = properties->GetStringValue(key, &value);
Run Code Online (Sandbox Code Playgroud)
我测试了许多approches
if (wcsstr(&value, L"Tedt2.csv") == 0)
{
wprintf(L"%ws: %ws\n", keyName, value);
}
Run Code Online (Sandbox Code Playgroud)
但它总是进入if.
有谁可以帮助我吗?它应该是微不足道的,但我有点迷失C++.我要做一个概念证明.