我刚刚安装了Windows 10 Creators Update(版本10.0.15063).
我安装了多个版本的Visual Studio(2012年,2013年,2015年和2017年).我几周前才安装了VS 2017.
在"VS2015 x64本机命令提示符"中运行时,CMake(版本3.8.1)不再找到C/C++编译器(在VS 2017命令提示符下运行时它可以正常工作).
内容CMakeLists.txt:
project (test)
add_executable (test test.cpp)
Run Code Online (Sandbox Code Playgroud)
(内容test.cpp无关紧要.)
在VS2015 x64本机命令提示符中进行CMake调用:
> mkdir build
> cd build
> cmake -G "Visual Studio 14 2015 Win64" ..
Run Code Online (Sandbox Code Playgroud)
CMake输出:
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:1 (project):
No CMAKE_C_COMPILER could be found.
CMake Error at CMakeLists.txt:1 (project):
No CMAKE_CXX_COMPILER could be found.
-- Configuring incomplete, …Run Code Online (Sandbox Code Playgroud) 有没有办法从Jekyll的Markdown文件中包含HTML部分?
例:
档案index.md:
---
layout: default
title: Home
---
This is a [Markdown](http://daringfireball.net/projects/markdown/) file.
{% include foobar.html %}
Run Code Online (Sandbox Code Playgroud)
档案_includes/foobar.html:
<ul>
<li>Foo</li>
<li>Bar</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎不适用于我的情况.
为了完整性,这是我的_config.yml文件的全部内容:
encoding: utf-8
markdown: kramdown
baseurl:
Run Code Online (Sandbox Code Playgroud) 我正在使用Newtonsoft的Json.NET 7.0.0.0将类从C#序列化为JSON:
class Foo
{
public string X;
public List<string> Y = new List<string>();
}
var json =
JsonConvert.SerializeObject(
new Foo(),
Formatting.Indented,
new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
Run Code Online (Sandbox Code Playgroud)
json这里的价值是
{ "Y": [] }
Run Code Online (Sandbox Code Playgroud)
但我想它是{ },如果Y是一个空列表.
我找不到一个令人满意的方法来实现这一目标.也许有自定义合约解析?
我正在研究C++链接器在模板特化方面的行为.我正在使用Microsoft Visual C++ 2010进行这些实验.我不知道其他工具链(例如gcc)的行为是否相同.
这是第一个代码片段:
// bar.cpp
template <typename T> int foo() { return 1; }
int bar() { return foo<double>(); }
// main.cpp
template <typename T> int foo() { return 1; }
template <> int foo<double>() { return 2; }
int bar();
int main()
{
const int x = bar();
const int y = foo<double>(); // doesn't link
}
Run Code Online (Sandbox Code Playgroud)
预计,此代码不会链接,因为它foo<double>()有多个定义,因为它在bar.cpp中实例化一次,在main.cpp中实例化一次(通过专门化).如果这个程序将链接,那么我们会期望bar()并且main()将使用不同的实例,foo()这样最终我们将得到x == 1和y == 2.
让我们通过声明 …
我有一个窗口包含一个QScrollArea带有几个小部件的窗口.
到目前为止,我在QScrollArea窗口的构造函数中创建了它的子窗口小部件,然后我正在垂直调整窗口大小以适应其内容resize(400, sizeHint().height()).到现在为止还挺好.
现在,我QScrollArea在运行时添加或删除小部件.添加或删除小部件后,如何使窗口垂直适合其内容,我该怎么办?我应该打电话adjustSize()吗? resize(sizeHint())?是应该打电话layout->activate()还是updateGeometry()先打电话?在这种情况下,哪种规模的政策真正重要 窗口,或滚动区域,或两者?我试着将它们全部设置为Expanding.
我在Windows上使用Qt 4.6.
给定两个浮点数,我正在寻找一种有效的方法来检查它们是否具有相同的符号,假设如果这两个值中的任何一个为零(+0.0或-0.0),则应认为它们具有相同的符号标志.
例如,
SameSignC++中一个天真但正确的实现是:
bool SameSign(float a, float b)
{
if (fabs(a) == 0.0f || fabs(b) == 0.0f)
return true;
return (a >= 0.0f) == (b >= 0.0f);
}
Run Code Online (Sandbox Code Playgroud)
假设IEEE浮点模型,这里的变体SameSign编译为无分支代码(至少使用Visual C++ 2008):
bool SameSign(float a, float b)
{
int ia = binary_cast<int>(a);
int ib = binary_cast<int>(b);
int az = (ia & 0x7FFFFFFF) == 0;
int bz = (ib & 0x7FFFFFFF) == 0;
int ab = …Run Code Online (Sandbox Code Playgroud) 多年来,我们一直在各种平台(Linux,Windows,Mac OS X,32位和64位)上构建大型开源软件,没有任何问题.然而,最近Mac OS X版本(64位)停止正常工作并开始随机崩溃.它或多或少与我们的构建机器上从10.7到10.8.2的Mac OS X更新一致(但编译器工具链没有改变,它仍然是llvm-gcc 4.2.1).
我们的应用程序由几个动态(共享)库和许多使用它们的可执行文件组成.由于各种原因,其中一个共享库会覆盖new和delete运算符.在Mac OS X(和Linux)上,默认情况下会导出所有符号,包括我们的重载new和delete运算符.Mac OS X上的崩溃似乎与一些内存子系统(不是我们的)分配的内存相关,然后通过我们自己的(并且不兼容的)delete实现释放.
最安静的解决方案似乎是阻止重载的操作员对共享库的用户可见.这可以通过两种方式实现:使用__attribute__((visibility("hidden")))或使用-unexported_symbols_list链接器命令行选项标记运算符以防止导出某些符号.遗憾的是,第一个解决方案不起作用:gcc发出警告,说操作符已被声明为不同(in <new>),因此属性将被忽略.根据我在不同地方的阅读,第二种解决方案似乎是解决这个问题的正确方法.但由于某种原因,我们无法使其发挥作用.
当链接共享库时,我们将-Wl,-unexported_symbols_list unexported_symbols_list.txt选项传递给g ++,而g ++又应该传递给ld.该unexported_symbols_list.txt文件包含以下符号列表:
__ZdaPv
__ZdaPvRKSt9nothrow_t
__ZdlPv
__ZdlPvRKSt9nothrow_t
__ZdlPvS_
__Znam
__ZnamRKSt9nothrow_t
__Znwm
__ZnwmPv
__ZnwmRKSt9nothrow_t
Run Code Online (Sandbox Code Playgroud)
这是所有的变化new和delete我们覆盖,并希望被隐藏.我们通过nm libappleseed.dylib使用将符号名称解开来找到这些符号c++filt.
这是CMake生成的命令行链接libappeseed.dylib:
/usr/bin/g++ -g -Werror -dynamiclib -Wl,-headerpad_max_install_names -framework Cocoa -lcurl -Werror -Wl,-unexported_symbols_list -Wl,unexported_symbols_list.txt -o ../mac-gcc4/appleseed/libappleseed.dylib [...]
Run Code Online (Sandbox Code Playgroud)
不幸的是,尽管我们付出了很多努力,但似乎仍然存在符号(如nm所示). …
我正在开发一个依赖Boost的大型C++项目.该项目使用CMake构建在各种平台上.在我的Windows机器上,我使用的是CMake 2.8.9,Visual Studio 2010和Boost 1.50.0(从源代码构建).
我一直在使用CMake和Boost多年没有问题,Boost版本已经老了1.33.现在,突然CMake不再找到Boost库.在我的机器上唯一改变的是我最近安装了Visual Studio 2012,但我不认为这与问题有任何关系(另一方面,据我记得,这是唯一的已经改变).
这是我用来调用CMake的命令行:
cmake ..\src -DBOOST_ROOT=..\..\boost -DQT_QMAKE_EXECUTABLE=..\..\qt-4.8.0\bin\qmake.exe
Run Code Online (Sandbox Code Playgroud)
这曾经完美无瑕地工作,但它现在输出:
-- Building for: Visual Studio 10
-- Check for working C compiler using: Visual Studio 10
-- Check for working C compiler using: Visual Studio 10 -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler using: Visual Studio 10
-- Check for working CXX compiler using: Visual Studio 10 …Run Code Online (Sandbox Code Playgroud) 我正在尝试准确描述 Linux 上当前 CPU 的数据缓存层次结构:不仅是单个 L1/L2/L3(可能还有 L4)数据缓存的大小,还有它们拆分或共享的方式核心。
例如,在我的 CPU(AMD Ryzen Threadripper 3970X)上,每个内核都有自己的 32 KB 的 L1 数据缓存和 512 KB 的 L2 缓存,但是 L3 缓存在一个核心复合体 (CCX) 内的内核之间共享。换句话说,有 8 个不同的 L3 缓存,每个 16 MB。
Windows 上 CPU-Z 的此屏幕截图的“缓存”部分基本上是我试图找出的内容:
我在 Windows 上使用GetLogicalProcessorInformation().
但是,在 Linux 上,它似乎sysconf()只给我 L1 和 L2 数据缓存的每核缓存大小(_SC_LEVEL1_DCACHE_SIZE和_SC_LEVEL2_DCACHE_SIZE),或总的 L3 缓存大小(_SC_LEVEL3_CACHE_SIZE)。
编辑: lstopo在 VMWare 下的输出。虚拟机有 8 个内核。L1 和 L2 缓存信息很好,但 L3 缓存大小似乎不正确:
我们使用的是MySQL 5.5.42.
我们有一个publications包含大约1.5亿行的表(SSD上大约140 GB).
该表有许多列,其中两列特别有用:
id 是表的主键,是类型 bigintcluster_id 是一个可以为空的列 bigint两列都有自己的(单独的)索引.
我们对表单进行查询
SELECT * FROM publications
WHERE id >= 14032924480302800156 AND cluster_id IS NULL
ORDER BY id
LIMIT 0, 200;
Run Code Online (Sandbox Code Playgroud)
这是问题:
id值越大(上例中的14032924480302800156),请求越慢.
换句话说,低值请求id是快速的(<0.1 s),但id值越高,请求越慢(最多几分钟).
如果我们在WHERE子句中使用另一个(索引的)列,那么一切都很好.例如
SELECT * FROM publications
WHERE inserted_at >= '2014-06-20 19:30:25' AND cluster_id IS NULL
ORDER BY inserted_at
LIMIT 0, 200;
Run Code Online (Sandbox Code Playgroud)
哪里inserted_at是类型timestamp.
编辑:
EXPLAIN使用时输出id >= 14032924480302800156:
id | select_type …Run Code Online (Sandbox Code Playgroud)