小编Dav*_*iD.的帖子

模板转换函数为const-reference

以下工作正常(正如人们所期望的那样):

struct X {};

struct A
{
  operator X const& () 
  {
    static const X value{};
    return value; 
  }
};

int main()
{
  A a;
  X x = a;
}
Run Code Online (Sandbox Code Playgroud)

但这不是那么清楚:

template<typename T>
struct X {};

struct A
{
  template<typename T>
  operator X<T> const& () 
  {
    static const X<T> value{};
    return value; 
  }
};

int main() 
{
  A a;
  X<int> x = a;
}
Run Code Online (Sandbox Code Playgroud)

GCC 4.9说,error: conversion from ‘A’ to non-scalar type ‘X<int>’ requested而clang 3.4没有任何问题.如果你从转换函数中删除const或者& …

c++ gcc clang gcc4.9

11
推荐指数
1
解决办法
232
查看次数

GCC:模板构造函数在需要copy-constructor时实例化

在下面的示例中,GCC >= 4.7实例化模板构造函数(您可以通过读取错误消息来观察),尽管只需要隐式生成的复制构造函数.

#include <type_traits>

// 'ambiguous' is ambiguous for 'ambiguous<int, int>'
template<typename A, typename B> 
struct ambiguous : std::false_type {};

template<typename T> 
struct ambiguous<int, T> : std::true_type {};

template<typename T> 
struct ambiguous<T, int> : std::true_type {};

// quantity
template<typename Type>
class quantity
{
public:
    quantity() = default;

    // Copy-constructor is implicitly created

    // Template constructor
    template<
        typename T,
        typename = typename std::enable_if<ambiguous<Type, T>::value>::type
    >
    quantity(quantity<T>) {}

    template<
        typename T,
        typename = typename std::enable_if<ambiguous<Type, T>::value>::type
    >
    void set(quantity<T>) …
Run Code Online (Sandbox Code Playgroud)

c++ gcc copy-constructor

8
推荐指数
1
解决办法
459
查看次数

gdb:SSE 寄存器输出格式

当我使用输出 SSE 寄存器时,print我得到了预期的结果:

(gdb) p $xmm0
$1 = {
    v4_float = {0, 0, 0, 0}, 
    v2_double = {0, 0}, 
    v16_int8 = {0 <repeats 16 times>}, 
    v8_int16 = {0, 0, 0, 0, 0, 0, 0, 0}, 
    v4_int32 = {0, 0, 0, 0}, 
    v2_int64 = {0, 0}, 
    uint128 = 0
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用info registers $xmm0所有内容都是十六进制的:

(gdb) i r $xmm0
xmm0           {
    v4_float = {0x0, 0x0, 0x0, 0x0}, 
    v2_double = {0x0, 0x0}, 
    v16_int8 = {0x0 <repeats 16 times>}, 
    v8_int16 = …
Run Code Online (Sandbox Code Playgroud)

debugging assembly gdb sse cpu-registers

5
推荐指数
1
解决办法
2651
查看次数

Rust:Unicode 感知的字符串匹配

我想确定某个字符串是否包含某个子字符串,同时考虑组合字符。为了说明这个问题,请考虑以下 Rust 示例:

\n
fn main() {\n    let a_umlaut = "a\\u{0308}"; // "\xc3\xa4"\n    println!("{}", a_umlaut.starts_with("a")); // true\n}\n
Run Code Online (Sandbox Code Playgroud)\n

基本上,上面的内容表明这"\xc3\xa4".starts_with("a")是正确的(注意第一个“a”上的分音符)。我确实在技术层面上理解这种行为的原因,但我仍然希望上面的代码输出false,因为“\xc3\xa4”和“a”是两个不同的用户感知字符。

\n

是否有现有的函数/创建在尊重组合字符的同时执行字符串匹配?

\n

unicode rust

5
推荐指数
1
解决办法
828
查看次数

是否对某些 Java 字节码指令进行了不必要的输入?

https://docs.oracle.com/javase/specs/jvms/se14/html/jvms-2.html#jvms-2.11.1 所述,将操作数类型编码为操作码是有代价的:

鉴于 Java 虚拟机的一字节操作码大小,将类型编码为操作码会给指令集的设计带来压力。如果每个类型化指令都支持 Java 虚拟机的所有运行时数据类型,那么指令数量将超过一个字节所能表示的数量。

因此,似乎应该只对需要操作数类型信息或启用优化的指令执行此操作。例如,需要区分iaddfadd,因为整数和浮点数的加法实现方式不同。而且我不知道为什么有不同的指令从数组(分别为和)加载 aboolean和 an ,但我至少可以想象一些性能原因。intbaloadiaload

但是,为什么将int( istore) 和float( fstore)存储到局部变量中有不同的指令?它们不应该以完全相同的方式实施吗?

这个答案/sf/answers/184670041/说字节码验证器需要输入指令。但这真的有必要吗?在一个方法中,所有数据都从方法的参数(类型已知)和类字段(类型也已知)流向其他类字段和返回值。因此,由于输入和输出的类型是已知的,我们不能为指令重建任何缺失的类型吗?事实上,这不是字节码验证器所做的,因为它必须检查类型,即它必须知道需要哪些类型?

简而言之:如果我们将istore和组合fstore成一条指令会破坏什么?性能或便携性会受到影响吗?字节码验证会停止工作吗?

java jvm bytecode

2
推荐指数
1
解决办法
116
查看次数

标签 统计

c++ ×2

gcc ×2

assembly ×1

bytecode ×1

clang ×1

copy-constructor ×1

cpu-registers ×1

debugging ×1

gcc4.9 ×1

gdb ×1

java ×1

jvm ×1

rust ×1

sse ×1

unicode ×1