我有以下代码:
class A {
public:
operator int() const { return 5; }
};
class B {
public:
operator int() const { return 6; }
};
int main() {
A a;
B b;
int myInt = true ? a : b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
尝试使用Visual Studio 2017 RC编译该代码会导致以下错误:
错误C2446 ::
:没有转换B为A注意:没有可用于执行此转换的用户定义转换运算符,或者无法调用运算符
...这是令人惊讶的,因为在这种情况下,我希望它将它们转换为通用类型int.
clang (4.0)成功编译相同的代码,没有任何错误或警告.
在这种情况下,哪两个是正确的,为什么?
c++ type-conversion ternary implicit-conversion operator-keyword
我无法破译这个汇编代码块.r1的价值到底是什么?我将如何到达那里?
3242ba66 f6454118 movw r1, 0x5c18
3242ba6a 466f mov r7, sp
3242ba6c f6c0415a movt r1, 0xc5a
3242ba70 f2460002 movw r0, 0x6002
3242ba74 f6c0405a movt r0, 0xc5a
3242ba78 4479 add r1, pc
3242ba7a 4478 add r0, pc
3242ba7c 6809 ldr r1, [r1, #0]
Run Code Online (Sandbox Code Playgroud) 我知道在程序集中调用函数时,r0包含第一个参数,直到r3为第四个参数.我知道当它超过四时,使用了堆栈指针,但我对具体细节不太确定.r0-r3是否仍然保持前四个,其余的是堆栈?我正在看下面的程序集试图理解它正在做什么来调用mach_msg(一个带有七个参数的函数).在输入此代码时,r0和r1包含两个参数
var_38 = -0x38
var_34 = -0x34
var_30 = -0x30
var_2C = -0x2C
var_24 = -0x24
var_20 = -0x20
var_18 = -0x18
var_14 = -0x14
var_10 = -0x10
var_C = -0xC
00001220
00001220 PUSH {R7,LR}
00001222 MOV R7, SP
00001224 SUB SP, SP, #0x30
00001226 MOV R2, (_NDR_record_ptr - 0x1232) ; _NDR_record_ptr
0000122E ADD R2, PC ; _NDR_record_ptr
00001230 LDR R2, [R2] ; _NDR_record
00001232 LDR R3, [R2]
00001234 LDR R2, [R2,#4]
00001236 STR R2, [SP,#0x38+var_10]
00001238 MOVS R2, #0x24 …Run Code Online (Sandbox Code Playgroud) 如果我想迭代字符串中的单个单词(由空格分隔),那么显而易见的解决方案是:
std::istringstream s(myString);
std::string word;
while (s >> word)
do things
Run Code Online (Sandbox Code Playgroud)
然而,这是非常低效的.在初始化字符串流时复制整个字符串,然后将每个提取的单词一次一个地复制到word变量中(这接近于第二次复制整个字符串).有没有办法在不手动迭代每个字符的情况下对此进行改进?
我重写了一个将struct指针作为参数的方法.我没有结构的声明,所以我不知道它的大小等.我能从一个指向它的指针找到一个结构吗?
我一直在使用Visual Studio在C++中读取文件来测试性能,我得到了一些我真的不明白的结果.
我的代码如下:
std::vector<unsigned char> Method1(std::string filePath)
{
std::basic_ifstream<unsigned char> file(filePath, std::ios::binary);
file.seekg(0, std::ios::end);
std::streamsize size = file.tellg();
file.seekg(0, std::ios::beg);
std::vector<unsigned char> buffer(size);
file.read(buffer.data(), size);
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
(我实际上使用了uint8_t而不是unsigned char,但因为它只是一个typedef,我在这里用后者来更好地演示问题)
我给它一个3mb文件来读取并使用std :: chrono函数来计时它们是我的结果:
Debug Configuration - 10.2秒
Release Configuration - 98 ms
调试和发布之间的巨大差异已经引起关注.
所以我尝试用"char"替换所有对"unsigned char"的引用(std :: basic_ifstream <char>而不是std :: basic_ifstream <unsigned char>等)并重新运行程序.
我发现它在调试和发布中都运行不到3ms.
稍微摆弄一下之后,我意识到basic_ifstream <unsigned char>就是问题所在.如果我按原样保留其他所有内容并将文件更改为basic_ifstream <char>(同时使用reinterpret_cast <char*>(buffer.data()),那么它也可以正常工作.
我在两台独立的机器上验证了这一点,一台运行Visual Studio 2015的最新版本,一台运行Visual Studio 15的预览版3.
是否存在某种微妙之处,使得basic_ifstream在使用无符号字符时表现如此糟糕?
在C中,断言可以通过定义消失NDEBUG,因此我们倾向于编写如下内容:
const bool ok = my_function();
assert(ok);
Run Code Online (Sandbox Code Playgroud)
但是,看起来Rust中的断言始终存在于每种类型的构建中,无论配置如何,因此更好的方法是:
let ok = my_function();
assert!(ok);
Run Code Online (Sandbox Code Playgroud)
要么:
assert!(my_function());
Run Code Online (Sandbox Code Playgroud) c++ ×4
arm ×2
assembly ×2
disassembly ×2
assert ×1
c ×1
debugging ×1
io ×1
loops ×1
objective-c ×1
performance ×1
pointers ×1
rust ×1
stack ×1
stl ×1
string ×1
struct ×1
ternary ×1
visual-c++ ×1