小编Bee*_*ope的帖子

如何静态检测丢失的@Override注释?

在Java 5和Java 6之间,关于@Override源于接口(而不是超类)的方法的注释的规则被改变了 - 在它们被允许之前,但在它们之后.但是,javac 并不要求它们.

某些IDE(如eclipse)可能会为此类缺失的覆盖生成错误或警告.我正在寻找可以检测缺失覆盖的任何类型的静态分析工具,因此我可以以编程方式报告/阻止它们.

它似乎不像我所知道的任何大型的像findbugs,等人可以做到 - 可能是因为@Override只有源保留级别,因此不存在于这些工具运行的.class文件中,并且源级别像checkstyle这样的工具不了解完整的类层次结构.

java eclipse oop overriding static-analysis

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

迭代for循环中的所有无符号整数

假设我想在循环中迭代所有整数for.为了便于讨论,假设我f(unsigned x)为每个整数调用一些未知函数:

for (unsigned i = 0; i < UINT_MAX; i++) {
     f(i);
}
Run Code Online (Sandbox Code Playgroud)

当然,上面的代码无法遍历所有整数,因为它错过了一个:UINT_MAX.将条件更改为i <= UINT_MAX仅导致无限循环,因为这是一个重言式.

你可以用do-while循环来完成它,但是你会失去for语法的所有细节.

我可以吃蛋糕(for循环)并吃掉它(迭代所有整数)吗?

c syntax loops for-loop

10
推荐指数
2
解决办法
715
查看次数

为什么写入缓冲区比写入零缓冲区要快42?

char *无论存储器1的现有内容如何,我都希望写入缓冲区花费相同的时间.不是吗?

然而,在缩小基准测试中的不一致性时,我遇到了一个显然不是这样的情况.包含全零的缓冲区在性能方面与填充缓冲区的缓冲区有很大不同42.

从图形上看,这看起来像(详情如下):

缓冲写入时间

这是我用来制作上述3的代码:

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <string.h>
#include <time.h>

volatile char *sink;

void process(char *buf, size_t len) {
  clock_t start = clock();
  for (size_t i = 0; i < len; i += 678)
    buf[i] = 'z';
  printf("Processing took %lu ?s\n",
      1000000UL * (clock() - start) / CLOCKS_PER_SEC);
  sink = buf;
}

int main(int argc, char** argv) {
  int total = 0;
  int memset42 = argc > 1 …
Run Code Online (Sandbox Code Playgroud)

c++ linux malloc performance memory-management

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

x86 上存储到加载转发失败的成本是多少?

在最新的 x86 架构上,存储到加载转发失败的成本是多少?

特别是,存储到加载转发会失败,因为加载部分与较早的存储重叠,或者因为较早的加载或存储跨越某些导致转发失败的对齐边界。

当然存在延迟成本:它有多大?是否还存在吞吐量成本,例如,失败的存储到加载转发是否使用了其他加载和存储甚至其他非内存操作无法使用的额外资源?

当存储的所有部分都来自存储缓冲区时,与混合存储缓冲区和 L1 的情况相比,是否有区别?

x86 intel cpu-architecture micro-optimization amd-processor

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

从List <Optional>转换为List <Optional <?>>是否安全?

如果您在Java中具有原始类型,则可以使用无界通配符安全地将其分配/转换为相同类型.例如,a List可以安全地转换为a List<?>,这会消除其原始特性,并允许您以安全(类型检查)的方式使用它1.

在另一方面,Java并不让您从投List 本身参数与原始类型,比如List<Optional>同类型的参数列表中采用无界通配符,像List<Optional<?>>.

您仍然可以通过完全丢弃原始数据List并再次备份(通过赋值隐式)来执行此操作:

List<Optional> rawOptionalList = null;
List<Optional<?>> wildcardOptionalList = (List)rawOptionalList;
Run Code Online (Sandbox Code Playgroud)

当然,这会触发关于未经检查的转换(从ListList<Optional<?>>)的警告.

在我看来,虽然这种转换可以保证安全:List<Optional<?>>不仅仅像List<Optional>将原始产品Optional转换Optional<?>为安全一样安全吗?


1 ...但你永远无法在此列表中添加任何内容,因为没有任何内容与?add(?)方法的捕获相匹配.这是你为安全付出的代价.

java generics

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

基于成员字段或函数创建比较器的快捷方式

我经常发现自己想为a创建一个比较器对象,struct或者class只是提取一个类的成员并对其进行常规<比较.

例如:

struct student {
   int id;
   std::string name;
};

// sort by ID
std::sort(students.begin(), students.end(), [](const student& l, const student& r){ return l.id < r.id; });
Run Code Online (Sandbox Code Playgroud)

那里有很多样板,特别是因为我们必须重复声明lr.标准库中是否有一种方法可以基于"提取器"函数创建比较器,该函数返回要比较的对象?

就像是:

std::sort(students.begin(), students.end(), compare_on([](const student& s){ return s.id; });
Run Code Online (Sandbox Code Playgroud)

我使用C++ 11的,但也有兴趣,如果有在以后的标准解决方案,不适用于C++ 11(所以我可以补充一下我的"的理由升级"列表).

我在这里要求使用单个成员作为合并,以及默认比较"小于",但是对于易于构成的技术的奖励点,例如允许您在字典顺序中使用两个字段,或者更改比较运算符.

c++ comparison c++11

10
推荐指数
2
解决办法
198
查看次数

mmap 是原子的吗?

mmap调用的效果是原子的吗?

也就是说,对mmap访问受影响区域的其他线程而言,由 所做的映射更改是否以原子方式出现?

作为试金石,请考虑您mmap在一个全为零的文件中执行 a 的情况(来自线程T1,这是此时唯一的线程),然后开始从该区域读取的第二个线程T2。然后,再次在 T1(原始线程)上mmap对同一区域进行第二次调用,将映射替换为针对所有 1 的文件的新映射。

是否有可能为读者线程读取一些页面一(即,见第二mmap的效果),然后随后从一些页面读取零(即,见效果的第一个映射)?

您可以假设读取器线程上的读取已被正确隔离,即上述效果不仅仅由于 CPU/一致性级别的内存访问重新排序而发生。

linux concurrency multithreading mmap memory-mapping

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

vzeroall 零寄存器 ymm16 到 ymm31 吗?

文件vzeroall出现不一致。散文说:

该指令将所有 XMM 或 YMM 寄存器的内容清零。

然而,下面的伪代码表明,在 64 位模式下,只有ymm0通过ymm15的寄存器会受到影响:

IF (64-bit mode)
    limit ?15
ELSE
    limit ? 7
FOR i in 0 .. limit:
    simd_reg_file[i][MAXVL-1:0] ? 0
Run Code Online (Sandbox Code Playgroud)

在AVX-512支持的机器清理到ymm15是不一样的清算“所有”,因为ymm16通过ymm31存在。

散文或伪代码是否正确?

x86 assembly intel avx avx512

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

在C中获取临时(复合文字)参数的地址

我无法想象这已经不是重复了,但我不能轻易找到答案,因为特别针对C++的更复杂的场景似乎主宰了讨论0.

在C99中取一个函数调用的参数列表中的临时构造地址是否合法?

例如,类似于init_listinit_desig_init如下的内容:

typedef struct {
  int x;
  int y;
} point_t;

int manhattan(point_t *p) {
  return p->x + p->y;
}

int init_list() {
  return manhattan(&(point_t){1, 2});
}

int init_desig_init() {
  return manhattan(&(point_t){.x = 1});
}
Run Code Online (Sandbox Code Playgroud)

三大1 似乎编译好了,但我实际上找不到一个参考,解释临时的生命周期至少会通过函数调用来扩展.


0事实证明,根据下面MM的回答,我的部分搜索问题是因为我正在寻找有关临时数据的信息,而这个特定初始化结构的正确C术语是复合文字.

1我应该称之为"大跨平台三",尊重MSVC,但实际上我的意思是"C编译器神棒支持".

c c99 initializer language-lawyer temporary-objects

9
推荐指数
1
解决办法
306
查看次数

如果您知道在到达有效区域的末尾之前找到该字符,那么调用长度过长的memchr是否合法?

在C11和C++ 11 1中是否有以下定义的行为?

bool has4() {  
    char buf[10] = {0, 1, 2, 4};
    return memchr(buf, 4, 20);
}
Run Code Online (Sandbox Code Playgroud)

在这里,我们通过了太长的时间memchr.数组有10个元素,但是我们传递了20.但是,我们要搜索的元素总是在结束之前找到.我很清楚这是否合法.

如果允许这样做,则会限制实现的灵活性,因为实现不能依赖于大小是可访问存储器区域大小的有效指示,因此必须小心读取超出找到的元素.一个例子是一个想要从传入指针开始执行16字节SIMD加载然后并行检查所有16个字节的实现.如果用户传递的长度为16,则只有在需要访问整个长度时才会安全.

否则(如果上面的代码是合法的),实现必须避免对目标元素之外的元素进行潜在的错误处理,例如通过对齐加载(可能很昂贵)或检查指针是否接近保护边界末尾.


1这里是一个罕见的问题,我猜C和C++的标记是有效的:据我所知,C++标准只是在行为方面通过引用直接推迟到C标准,但如果不是这样的话我想知道.

c language-lawyer c++11 c11

9
推荐指数
1
解决办法
406
查看次数