我正在尝试在编译时计算字符串文字的长度.为此,我使用以下代码:
#include <cstdio>
int constexpr length(const char* str)
{
return *str ? 1 + length(str + 1) : 0;
}
int main()
{
printf("%d %d", length("abcd"), length("abcdefgh"));
}
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作,程序打印4和8.由clang生成的汇编代码显示结果在编译时计算:
0x100000f5e: leaq 0x35(%rip), %rdi ; "%d %d"
0x100000f65: movl $0x4, %esi
0x100000f6a: movl $0x8, %edx
0x100000f6f: xorl %eax, %eax
0x100000f71: callq 0x100000f7a ; symbol stub for: printf
Run Code Online (Sandbox Code Playgroud)
我的问题:标准是否保证length函数将在编译时进行评估?
如果这是真的,编译时字符串文字计算的大门刚刚为我打开...例如,我可以在编译时计算哈希值等等......
在我目前的代码库中,我看到以下模式:
#if SOMETHING_SUPPORTED+0 != 0
...
#endif
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是一个非常古老的代码库,没有人知道它是如何以及为何开始的 我认为它是从C开始的,它慢慢地转换为C类,现在它倾向于C++
我看不到使用先前构造而不是"经典"的任何明显优势,但也许我错过了一些东西:
#if SOMETHING_SUPPORTED
...
#endif
Run Code Online (Sandbox Code Playgroud)
你知道为什么会使用#if MACRO+0 != 0而不是#if MACRO?
我想找出2个矢量(2D,3D)之间的顺时针角度.
使用点积的clasic方式给出了内角(0-180度),我需要使用一些if语句来确定结果是否是我需要的角度或其补码.
你知道计算顺时针角度的直接方法吗?
在C++中是否能够将物理单位定义为单独的类型并在这些类型之间定义有效的操作?
引入很多类型和大量的运算符重载是否有任何优势,而不是仅使用普通的浮点值来表示它们?
例:
class Time{...};
class Length{...};
class Speed{...};
...
Time operator""_s(long double val){...}
Length operator""_m(long double val){...}
...
Speed operator/(const Length&, const Time&){...}
Run Code Online (Sandbox Code Playgroud)
哪里Time,Length并且Speed只能作为来自不同运营商的返回类型创建?
在 C++ 标准库中有将字符串转换为数字类型的函数:
stoi
stol
stoll
stoul
stoull
stof
stod
stold
Run Code Online (Sandbox Code Playgroud)
但我发现在模板代码中使用它们很乏味。为什么没有模板函数,例如:
template<typename T>
T sto(...)
Run Code Online (Sandbox Code Playgroud)
将字符串转换为数字类型?
我没有看到任何不拥有它们的技术原因,但也许我错过了一些东西。它们可以专门用于调用底层命名函数并使用enable_if/concepts禁用非数字类型。
标准库中是否有任何模板友好的替代方案可以将字符串转换为数字类型,反之亦然?
我看到VS2010在解决方案文件夹(.sdf,.suo,.ipch等)中创建了一些文件.是否可以更改创建这些文件的文件夹?
谢谢!
我正在研究一个简单的解析器,在进行分析时我发现瓶颈在...文件读取!我摘录了非常简单的测试来比较的性能fstreams和FILE*读取数据的大斑点时:
#include <stdio.h>
#include <chrono>
#include <fstream>
#include <iostream>
#include <functional>
void measure(const std::string& test, std::function<void()> function)
{
auto start_time = std::chrono::high_resolution_clock::now();
function();
auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now() - start_time);
std::cout<<test<<" "<<static_cast<double>(duration.count()) * 0.000001<<" ms"<<std::endl;
}
#define BUFFER_SIZE (1024 * 1024 * 1024)
int main(int argc, const char * argv[])
{
auto buffer = new char[BUFFER_SIZE];
memset(buffer, 123, BUFFER_SIZE);
measure("FILE* write", [buffer]()
{
FILE* file = fopen("test_file_write", "wb");
fwrite(buffer, 1, BUFFER_SIZE, file);
fclose(file);
});
measure("FILE* read", [buffer]() …Run Code Online (Sandbox Code Playgroud) 为什么这是一个警告?我认为在很多情况下使用multi-char int常量而不是"无意义"数字或者使用相同值定义const变量更为明确.解析wave/tiff /其他文件类型时,可以更清楚地将读取值与某些"EVAW","数据"等进行比较,而不是相应的值.
示例代码:
int waveHeader = 'EVAW';
Run Code Online (Sandbox Code Playgroud)
为什么这会发出警告?
有没有办法阻止在C++中通过声明删除指针?
我试过没有运气的代码.
const int* const foo()
{
static int a;
return &a;
}
int main()
{
const int* const a = foo();
*a = 1; //compiler error, const int*
a++; //compiler error, int* const
delete a; //no compiler error, I want to have compiler error here
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我是C++ std :: stream的新手,我正在做一些测试.我有这个简单的代码:
int i = 10;
char c = 'c';
float f = 30.40f;
std::ofstream out("test.txt", std::ios::binary | std::ios::out);
if(out.is_open())
{
out<<i<<c<<f;
out.close();
}
Run Code Online (Sandbox Code Playgroud)
正如std::ios::binary我在test.txt文件中所期望的那样打开流以具有二进制表示形式i,c并且f,但是我有10c30.4.
你能告诉我我做错了什么吗?
c++ ×9
c ×2
c++11 ×2
angle ×1
casting ×1
constexpr ×1
iostream ×1
math ×1
performance ×1
portability ×1
standards ×1
type-safety ×1