我正在尝试使用OpenSSL,但我仍然坚持编译的步骤.OpenSSL项目有非常不友好(坏)的文档.
有没有实际帮助如何使用Visual Studio 2017在Windows上构建最新的OpenSSL版本?
我没有在官方OpenSSL网站上找到任何有用的信息.是的,互联网上有很多关于OpenSSL编译的帖子,但所有帖子都已过时.
我正在对C++和Delphi进行比较,我发现了一些棘手的东西.
这是非常简单的C++代码:
template<typename T>
class C {
class D {
T x;
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们认为类C是模板类(=泛型类),嵌套类D也是模板类.如果T是double,则x内部D是double.
我不能这样说:
template<typename T>
class C {
template<typename T>
class D {
T x;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个错误,因为我已经"内部" C而另一个T将是一个冲突.要修复错误,我应该使用不同的名称,例如U.
template<typename T>
class C {
template<typename U>
class D {
T x;
}
}
Run Code Online (Sandbox Code Playgroud)
在Delphi中,我可以这样写:
type
TClassC<T> = class
private
type
TClassD = class
private
x: T;
end;
end; …Run Code Online (Sandbox Code Playgroud) 我偶然发现了一种情况,库std::vector<T>使用用户提供的比较对象对容器(例如)进行排序。对于一种特定情况,用户实际上不想对容器进行排序,但排序是无条件发生的。
因此,为了尽量避免这种情况,我想尝试使用根据元素地址排序的比较对象。等价地,我们有:
std::vector nums{1, 5, 4};
auto cmp = [](auto& a, auto& b) { return &a < &b; };
std::sort(nums.begin(), nums.end(), cmp);
Run Code Online (Sandbox Code Playgroud)
这是“有效的”,因为std::vector<T>元素以与向量中元素相同的顺序存储在(连续)内存位置中。最终结果是,nums即使在排序之后,向量似乎也没有被改变。
但是,一旦我替换std::vector<T>为std::array<T, N>,我就会遇到分段冲突(请参阅https://gcc.godbolt.org/z/9srehdbhG)。
我的第一个想法是我违反了https://en.cppreference.com/w/cpp/algorithm/sort中列出的类型要求:
RandomIt必须满足ValueSwappable和LegacyRandomAccessIterator的要求。- 解除引用的类型必须满足MoveAssignable和MoveConstructible
RandomIt的要求。Compare必须满足Compare的要求。
我的假设是元素的地址在整个排序过程中保持稳定 - 这几乎肯定是错误的。
那么,std::sort()我违反了哪些要求/先决条件?
我只是注意到std::nextafter(0, 1)在我的系统上似乎产生一个大于0且小于0的值std::numeric_limits::min().
这怎么可能?我认为min()返回大于0的最小可能数.
#include <iostream>
int main(int argc, char *argv[])
{
double next = std::nextafter(0.0, 1.0);
double min = std::numeric_limits<double>::min();
std::cout << "next: " << next << "\nmin: " << min << "\nnext<min: " << (next < min) << "\nnext>0: " << (next > 0.0) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
next: 4.94066e-324
min: 2.22507e-308
next<min: 1
next>0: 1
Run Code Online (Sandbox Code Playgroud)
我的编译器是MinGW 5.3.0 32bit.
试图理解 ISO 标准 c++ 中的第 20 条:
更改:对垃圾收集区域的支持最少。
基本原理:新功能需要。
对原始特性的影响:有效的 C++ 2003 代码,在没有可追踪指针支持的情况下编译,使用声明可达的区域与较新的 C++ 代码交互可能具有不同的运行时行为。
https://timsong-cpp.github.io/cppwp/n4618/diff.cpp03.utilities
什么是可追踪指针(不是可追踪指针对象)?可追踪指针和普通指针有什么区别?
std::pair当 a 包含不可移动的内容时,我无法弄清楚完美转发 a 的语法。
#include <mutex>
#include <list>
#include <utility>
struct A
{
A(int x)
{
}
};
int main()
{
std::list<std::pair<std::mutex, std::mutex>> v;
v.emplace_back(); // ok
std::list<std::pair<A, A>> v2;
v2.emplace_back(3, 4); // ok
std::list<std::pair<A, std::mutex>> v3;
v3.emplace_back(3, std::forward<std::mutex>(std::mutex{})); // help
}
Run Code Online (Sandbox Code Playgroud) 为什么下面的代码片段是合法的 C++ 代码?这是一个纯粹的理论问题 - 我没有想到任何用例:
#include <optional>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v{1, 2, 3};
const std::optional<std::vector<int>> ov = v;
const auto nv = std::move(ov.value());
for (const auto& x : *ov) { std::cout << x; }
for (const auto& x : nv) { std::cout << x; }
}
Run Code Online (Sandbox Code Playgroud)
这产生了123123,但我不明白原因。
std::move应用于 a 的值const optional?optional ov仍然持有vector?是否ov.value()在内部创建一个临时副本,然后从中移动?
我使用的是一个Javascript文件,它是其他JavaScript文件的串联.
不幸的是,将这些JavaScript文件连接在一起的人在读取文件时没有使用正确的编码,并允许将每个JavaScript文件的BOM写入连接的JavaScript文件.
有没有人知道搜索连接文件并删除任何/所有BOM标记的简单方法?
对Mac OSX使用PHP或bash脚本会很棒.
我有这个代码:
#include <iostream>
using namespace std;
int print(int i)
{
cout << endl << i;
}
template<typename ...Args>
inline void pass(Args&&...args)
{
}
template<typename ...args>
inline void expand(args&&... a)
{
print(a) ...; //this doesn't expand
//pass( print(a)... ); this works
}
int main() {
expand(1,2,3,4);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它抛出一个错误:
In function 'void expand(args&& ...)':
error: expected ';' before '...' token
print(a) ...;
^
parameter packs not expanded with '...':
print(a) ...;
^
Run Code Online (Sandbox Code Playgroud)
为什么要使用这个pass()功能?
我想知道当前处理器上的二级缓存大小是多少。幸运的是,有一个名为的库cpu_features可以实现这一点,甚至更多。在内部,它使用cpuid指令来获取所有这些信息。
我想知道,如果我尝试在混合架构(例如 Alder Lake)上使用它会发生什么?其效率和性能核心具有不同的特点。我假设该cpuid指令返回有关当前线程运行的核心的信息。所以基本上,如果它被安排在性能核心上运行,它会描述性能核心。
这样做的问题是操作系统可以决定稍后将线程移动到效率核心,在这种情况下,从中接收到的任何信息都cpuid不再正确。并且该程序甚至不知道它已被迁移。这可以通过手动将线程“固定”到核心并设置其亲和力来解决。为了区分性能和效率核心,我可以按顺序将线程固定到每个核心,并比较cpuid.
不过,我想知道cpuid结果是否确实依赖于核心,以及是否有更好的方法来查询有关处理器的信息,而无需循环遍历所有核心,只需将它们分类为其中一个两类。