struct A
{
int x;
}
A t{};
t.x = 5;
new (&t) A;
// is it always safe to assume that t.x is 5?
assert(t.x == 5);
Run Code Online (Sandbox Code Playgroud)
据我所知,当创建类类型的普通对象时,编译器可以省略显式或隐式默认构造函数的调用,因为不需要初始化。(是对的吗?)
那么,如果在一个生命周期已经开始的普通对象上执行放置 new ,是否可以保证保留其对象/值表示?(如果是这样,我想知道在哪里可以找到规范..)
根据区域设置,CSV 分隔符(或列表分隔符)可能会;代替,,这至少在 Windows 上取决于区域设置。
有没有跨平台的方法来检测 Qt 的 CSV 分隔符是什么?
如果没有跨平台的方法,是否有Windows特定的方法?
我正在尝试在Visual Studio 2017(版本15.6.6,使用“ Light”主题)中配置突出显示括号,但是我无法使其正常工作,并且我不明白我是在做错还是功能是越野车。
我只是希望Visual Studio使匹配的括号变成红色,而不是使背景变成灰色的默认设置。
通过转到Tools -> Options -> Environment -> Fonts and Colors,我发现三个设置:
显然,前两个没有。我尝试将前景和背景设置为不同的颜色,但是即使重启后也看不到任何变化。唯一可以做某事的设置是第三个设置,在这里我可以按预期更改背景矩形的颜色。但这不是我想要的。
为什么前两个设置什么都不做?是虫子吗?如何使匹配的括号变成红色?
我发现了有关Visual Studio 2013和Visual Studio 2015的其他问题。他们无济于事,后者证明是一个错误。这是另一个吗?
有人可以在32位机器上解释这个奇怪的输出吗?
#include <stdio.h>
int main() {
printf("16777217 as float is %.1f\n",(float)16777217);
printf("16777219 as float is %.1f\n",(float)16777219);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产量
16777217 as float is 16777216.0
16777219 as float is 16777220.0
Run Code Online (Sandbox Code Playgroud)
奇怪的是,16777217投射到较低的值,而16777219投射到更高的值......
我了解它的大部分工作原理,除了main函数中的第二行:int* end = array+5;。那条线是如何工作的?
#inlcude <iostream>
int main()
{
int array[] = {10, 20, 29, 200, 2};
int* end = array+5;
for(int* it = array; it != end; ++it)
{
std::cout << *it << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
应该只打印列表中的每个元素。
我有一个关于二维数组的内存布局的问题。当我们定义一个,就像 int 一样a[3][4],分配给这个数组的内存是连续的吗?
或者换句话说,二维数组是否被实现为连续的一维数组?
如果答案是肯定的,访问是否a[0][6]等同于访问a[1][2]?
我编写了以下 C 程序。
#include <stdio.h>
int main(){
int a[3][4] = {{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}};
printf("%d %d\n", a[0][6], a[1][2]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我发现输出是7 7.
a[0][6]看似非法,但它指出a[1][2],我想知道为什么,这样的操作合法吗?
c arrays memory-layout multidimensional-array language-lawyer
我是 malloc 和对齐 malloc 的新手。我知道如何使用它们。但是,我不知道在什么情况下我们应该使用对齐的 malloc 而不是标准的 malloc。你能给我解释一下吗?
受到" 使用编译时HTML解析的C++ HTML模板引擎 "的想法的启发,我试图编写一个示例类来检查字符串中的第一个字符是否是a.
int dummy[0];
class Test
{
public:
constexpr Test(const char *p):p_(p){}
constexpr void check()const
{
if (p_[0]!='a')
dummy[1]=0;
}
const char *p_;
};
constexpr Test operator"" _test(const char *pszText, size_t)
{
Test t(pszText);
t.check();
return t;
}
int main()
{
//dummy[1] = 0;
constexpr Test t = "baa"_test;
}
Run Code Online (Sandbox Code Playgroud)
它运行良好(UCCntu上的GCC7.1).如果第一个char不是a,它将给出编译错误:
main.cpp:29:24: error: array subscript value ‘1’ is outside the bounds
of array ‘dummy’ of type ‘int [0]’
constexpr Test t = "baa"_test;
Run Code Online (Sandbox Code Playgroud)
令我感到困惑的是,如果我将代码更改为: …
我正在使用 mt19937 从给定种子生成随机字符串,如下所示:
std::string StringUtils::randstring(size_t length, uint64_t seed) {
static auto& chrs = "abcdefghijklmnopqrstuvwxyz";
thread_local static std::mt19937 rg(seed);
thread_local static std::uniform_int_distribution<std::string::size_type> pick(0, sizeof(chrs) - 2);
std::string s;
s.reserve(length);
while(length--) {
s += chrs[pick(rg)];
}
return s;
}
Run Code Online (Sandbox Code Playgroud)
我想保证随机数序列(以及生成的随机字符串)在同一架构的不同机器上是相同的,根据这个问题的答案应该是这样的。
但是,当我重建二进制文件(不更改任何依赖项或库)时,同一种子的随机数序列会发生变化(与使用相同种子的先前构建生成的序列相比)。
如何从同一机器架构+映像(x86_64 Linux)上不同二进制文件的给定种子生成有保证的随机数序列?