小编ant*_*rds的帖子

通过Span <T>修改变量时,优化的构建和JIT编译是否会产生问题?

假设我MemoryMarshal.CreateSpan用来访问本地值类型的字节,例如以下(不是很有用)的代码:

using System;
using System.Runtime.InteropServices;

// namespace and class boilerplate go here

private static void Main()
{
    int value = 0;
    Span<byte> valueBytes = MemoryMarshal.AsBytes(MemoryMarshal.CreateSpan(ref value, 1));

    var random = new Random();
    while (value >= 0) // the check in question
    {
        random.NextBytes(valueBytes);
        Console.WriteLine(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

尽管此代码按预期工作,但是如果未在循环中修改true变量value(除非通过valueBytes跨度间接修改),则指示的检查是否可以保证在编译为IL和JIT编译时仍可生存,而没有优化为?我可以依靠读value给我写的内容的阅读valueBytes吗,还是容易重新排序?还是因为最近刚接触C ++而感到偏执?

(请注意,我知道还有其他方法可以达到上述代码的预期效果,这不是关于如何获取全范围的32位随机整数或关于某个较大应用程序的XY问题的问题,我我试图将这段代码放入,不存在更大的应用程序)

c# memory compilation

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

是否有可能在编译时测试类型是否支持C++中的负零?

有没有办法写一个类型特征来确定一个类型是否支持C++中的负零(包括整数表示,如符号和大小)?我没有看到任何直接这样做的东西,并且std::signbit似乎不是constexpr.

澄清:我问,因为我想知道这是否可能,无论用例是什么,如果有的话.

c++ signed types type-traits negative-zero

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

使用bit_cast在C ++ 20中将整数转换为GLvoid *是否有效?

上一个问题曾问过如何在整数类型和GLvoid*C ++ 11之间进行转换(基于该问题的标签),但是在这里我对C ++ 20感兴趣。

现在,std::bit_cast可以选择进行类型转换了,我想知道这是否是将整数与OpenGL函数结合使用的“正确”方法,而OpenGL函数由于历史原因需要使用a GLvoid*来表示字节偏移量(例如glDrawRangeElements),或者应改用上一个问题引用的方法。

c++ opengl casting c++20

4
推荐指数
2
解决办法
114
查看次数

标签 统计

c++ ×2

c# ×1

c++20 ×1

casting ×1

compilation ×1

memory ×1

negative-zero ×1

opengl ×1

signed ×1

type-traits ×1

types ×1