小编BZK*_*ZKN的帖子

为什么编译器优化不生成 1..N 整数之和的循环?

为了更好地理解编译器,特别是汇编语言,我一直在尝试一段简单的代码,其中N计算第一个数字的总和,这应该导致N(N+1)/2or N(N-1)/2

正如代码所示,有两个函数:

#include <cstdint>


// Once compiled with optimization, the generated assembly has a loop

uint64_t sum1( uint64_t n ) {  
    uint64_t sum = 0;
    for ( uint64_t j=0; j<=n; ++j ) {
        sum += j;
    }
    return sum;
}

// Once compiled with optimization, the generated assembly of the following has no loop

uint64_t sum2( uint64_t n ) {  
    uint64_t sum = 0;
    for ( uint64_t j=0; j<n; ++j ) {
        sum += …
Run Code Online (Sandbox Code Playgroud)

c++ assembly loops clang compiler-optimization

14
推荐指数
1
解决办法
1095
查看次数

在实现 proc 宏时,如何检查类型是否实现了特征?

我正在尝试创建一个proc-macro派生和实现结构的特征,并且我需要结构中的所有字段都实现Display

我该如何检查?

此外,我如何检查属性是否Iterator也实现了?(我想处理迭代器的项目是否也实现了显示)。

我正在使用synquote板条箱。我设法解析struct并生成实现。但对于像Vec和这样的类型Option,我想检查他们是否Iterator正确实现和处理它。

syn::Field结构具有ty我认为应该作为起点的属性,但是查看文档我无法猜测任何方法来检查此类型是否实现了某种特征。

rust rust-proc-macros

10
推荐指数
1
解决办法
3419
查看次数

像主题一样自定义 Jetpack Compose 中的 ContentAlpha

我的客户有非常严格的设计准则,例如对于 alpha:\n文本不应有 alpha。

\n

但是,我似乎无法以类似主题的方式自定义 MaterialDesign\xc2\xb4s alpha 。

\n

当然,我可以自定义每个组件,但这很乏味:\nModifier.alpha(1.0f)

\n

当然,我可以将整个应用程序包装在 alpha-Provider 中,但大多数材料组件会覆盖它,例如AppBar,所以这也不能按预期工作。

\n
// my wrapper:\nCompositionLocalProvider(LocalContentAlpha provides 1.0f) { /* my ui */ }\n\n// will be overwritten by \n@Composable\nprivate fun AppBar(...) {\n    Surface(...) {\n        CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {\n            Row(..., content)\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

所以我想我应该做的是提供一个 custom ContentAlpha,因为它几乎用于每个材质组件,但我不知道如何做。你?

\n

kotlin android-jetpack-compose

6
推荐指数
1
解决办法
1237
查看次数

哪里描述了网络块设备格式?

网络块设备协议的格式是什么?据说它简单,但我找不到任何 RFC 或类似的东西来描述客户端和服务器应该发送的内容。

networking network-protocols network-block-device

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

使用“JsonContentPolymorphicSerializer”时,Kotlinx 反序列化不包含抽象类的属性

假设有一个抽象类BaseClass ...

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable(with = PolymorphicSerializer::class)
abstract class BaseClass {
    @SerialName("bid")
    var baseId: String? = null
 }
Run Code Online (Sandbox Code Playgroud)

...扩展它的类ExtendedClass ...

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
class ExtendedClass
    (@SerialName("eid")
     var newId: String? = null
) : BaseClass()
Run Code Online (Sandbox Code Playgroud)

...和多态序列化器

import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.json.JsonContentPolymorphicSerializer
import kotlinx.serialization.json.JsonElement

object PolymorphicSerializer  : JsonContentPolymorphicSerializer<BaseClass>(BaseClass::class) {
    override fun selectDeserializer(element: JsonElement): DeserializationStrategy<out BaseClass> {
        return ExtendedClass.serializer()
    }
}
Run Code Online (Sandbox Code Playgroud)

使用PolymorphicSerializer是因为 JSON 可以反序列化为基于某些属性扩展BaseClass 的不同类(为了简单起见,我只使用了ExtendedClass.serializer()

现在,如果我们尝试将通用 JSON 反序列化为ExtendedClass ...

class DeserializationTest …
Run Code Online (Sandbox Code Playgroud)

android kotlin kotlinx.serialization

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

C 联合类型双关数组

鉴于以下代码,我有一些与类型双关相关的问题。我看不出这没有违反严格的别名规则,但我无法指出具体的违规行为。我最好的猜测是,将联合成员传递到函数中违反了严格的别名。

以下代码位于Compiler Explorer上。

#include <stdint.h>

union my_type
{
    uint8_t m8[8];
    uint16_t m16[4];
    uint32_t m32[2];
    uint64_t m64;
};

int func(uint16_t *x, uint32_t *y)
{
    return *y += *x;
}

int main(int argc, char *argv[])
{
    union my_type mine = {.m64 = 1234567890};
    return func(mine.m16, mine.m32);
}
Run Code Online (Sandbox Code Playgroud)

我的观察:

  • 假设参数func不互相别名,func则不违反严格别名。
  • 在 C 语言中,允许使用unionfor 类型双关。
  • 通过m16m32进入func必须违反某些内容。

我的问题:

  • 像这样的数组类型双关有效吗?
  • 我将指针传递给 到底违反了什么func
  • 在这个例子中我还遗漏了哪些其他问题?

c c99 c11

4
推荐指数
1
解决办法
371
查看次数

Bower 无法安装 Faker@3.1.0

我们有一个旧的 ember 应用程序,bower.json配置如下:

{
  "name": "my-app",
  "dependencies": {
    "Faker": "~3.1.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

它已经工作了很多年,最近我们在构建时发现以下错误

bower install
bower Faker#~3.1.0          not-cached https://github.com/Marak/Faker.js.git#~3.1.0
bower Faker#~3.1.0             resolve https://github.com/Marak/Faker.js.git#~3.1.0
bower Faker#~3.1.0        ENORESTARGET No tag found that was able to satisfy ~3.1.0

Additional error details:
No versions found in https://github.com/Marak/Faker.js.git
Run Code Online (Sandbox Code Playgroud)

我检查了https://github.com/Marak/Faker.js,错误是正确的。没有了3.1.0,当前版本是6.6.6. 但是 git 提交历史记录3.1.0再也找不到版本了。

有没有办法让我从某个地方找到 3.1.0?看来作者清理了旧版本?

faker bower bower-install

0
推荐指数
1
解决办法
700
查看次数