假设我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++中的负零(包括整数表示,如符号和大小)?我没有看到任何直接这样做的东西,并且std::signbit似乎不是constexpr.
澄清:我问,因为我想知道这是否可能,无论用例是什么,如果有的话.
上一个问题曾问过如何在整数类型和GLvoid*C ++ 11之间进行转换(基于该问题的标签),但是在这里我对C ++ 20感兴趣。
现在,std::bit_cast可以选择进行类型转换了,我想知道这是否是将整数与OpenGL函数结合使用的“正确”方法,而OpenGL函数由于历史原因需要使用a GLvoid*来表示字节偏移量(例如glDrawRangeElements),或者应改用上一个问题引用的方法。
c++ ×2
c# ×1
c++20 ×1
casting ×1
compilation ×1
memory ×1
opengl ×1
signed ×1
type-traits ×1
types ×1