小编sle*_*ske的帖子

如果修改它的命令崩溃或被中止,git存储库是否会被破坏?

在玩游戏时git,我有时会尝试一些东西,然后中止需要太长时间的git svn命令(例如在网络问题期间挂起的某些命令).这让我想到:

强制中止命令(Ctrl-C或kill)是否总是安全的?如果命令崩溃(内存不足,错误,网络/ FS问题)怎么办?存储库更改是"事务性的",因为不完整的更改会"回滚"(如在版本控制文件系统中)吗?或者在这种情况下我是否存在存储库损坏风险

我确信使用git的聪明人必须考虑到这一点,但我在git手册或网上找不到任何信息.

git crash transactional

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

根据标准,C中的指针标记是否未定义?

一些动态类型语言使用指针标记作为识别或缩小所表示值的运行时类型的快速方法.执行此操作的经典方法是将指针转换为适当大小的整数,并在最低有效位上添加标记值,对于对齐的对象,这些位被假定为零.当需要访问对象时,标记位被屏蔽掉,整数转换为指针,指针被正常解除引用.

这本身就是有序的,除了它都取决于一个巨大的假设:对齐的指针将转换为保证在正确位置具有零位的整数.

是否可以根据标准的字母保证这一点?


虽然标准的6.3.2.3节(参考C11草案)说从指针到整数的转换结果是实现定义的,但我想知道的是6.5.2.1和6.5.6中的指针算术规则是否有效约束指针 - >整数转换的结果遵循许多程序已经假设的相同的可预测算术规则.(6.3.2.3注释67似乎表明这是标准的预期精神,而不是那意味着很多.)

我特别想到的情况是,人们可能会分配一个大型数组作为动态语言的堆,因此我们所讨论的指针是这个数组的元素.我假设C分配数组本身的开始可以通过一些辅助手段放置在对齐位置(尽管如此也是这样讨论).假设我们有一个八字节"cons cell"数组; 我们可以保证指向任何给定单元格的指针将转换为标记最低三位的整数吗?

例如:

typedef Cell ...; // such that sizeof(Cell) == 8
Cell heap[1024];  // such that ((uintptr_t)&heap[0]) & 7 == 0

((char *)&heap[11]) - ((char *)&heap[10]); // == 8
(Cell *)(((char *)&heap[10]) + 8);         // == &heap[11]
&(&heap[10])[0];                           // == &heap[10]
0[heap];                                   // == heap[0]

// So...
&((char *)0)[(uintptr_t)&heap[10]];        // == &heap[10] ?
&((char *)0)[(uintptr_t)&heap[10] + 8];    // == &heap[11] ?

// ...implies?
(Cell *)((uintptr_t)&heap[10] + …
Run Code Online (Sandbox Code Playgroud)

c standards-compliance language-lawyer

11
推荐指数
2
解决办法
907
查看次数

为什么-Wcast-align没有警告在x86上从char*转换为int*?

我知道gcc有一个选项-Wcast-align,只要指针被转换就会发出警告,以便增加目标所需的对齐.

这是我的计划:

char data[10];
int ptr = *((int *)data);
Run Code Online (Sandbox Code Playgroud)

在我的机器上,数据的对齐要求是1,而ptr是8.

为什么我没有收到警告?

可能是因为我正在为x86编译吗?

c memory-alignment gcc-warning typecasting-operator

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

如果SSL/TLS证书没有真正的签名/ CA,为什么会自签名?

我理解通常SSL(或更确切地说是X.509)证书应由某些认证机构签署,以确保它是真实的.

在某些情况下,不存在此类签名,例如,如果您为测试目的生成证书,或者您证书颁发机构(根证书).在这些情况下,使用自签名证书.

我的问题:为什么要使用这种奇怪的自签名结构?为什么证书不能简单地没有任何签名?包含自签名签名收益的内容是什么?

或者仅仅因为它在技术上更容易(没有签名的特殊情况)总是在每个证书中都有签名,即使它是无意义的签名?

ssl cryptography ssl-certificate

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

如果我转换函数指针,更改参数的数量会发生什么

我刚刚开始围绕C中的函数指针.要了解函数指针的转换是如何工作的,我编写了以下程序.它基本上创建了一个函数指针,该函数指向一个带有一个参数的函数,将它转换为带有三个参数的函数指针,并调用该函数,提供三个参数.我很好奇会发生什么:

#include <stdio.h>

int square(int val){
  return val*val;
}

void printit(void* ptr){
  int (*fptr)(int,int,int) = (int (*)(int,int,int)) (ptr);
  printf("Call function with parameters 2,4,8.\n");
  printf("Result: %d\n", fptr(2,4,8));
}


int main(void)
{
    printit(square);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这编译并运行时没有错误或警告(在Linux/x86上为gcc -Wall).我系统的输出是:

Call function with parameters 2,4,8.
Result: 4
Run Code Online (Sandbox Code Playgroud)

显然,多余的论点只是默默地被抛弃了.

现在我想了解这里发生了什么.

  1. 至于合法性:如果我理解正确地将函数指针强制转换为另一种类型的答案,那么这只是未定义的行为.因此,运行并产生合理结果的事实只是纯粹的运气,对吗?(或编译器编写者的好看)
  2. 为什么gcc不会警告我这个,即使是Wall?这是编译器无法检测到的东西吗?为什么?

我来自Java,那里的类型检查要严格得多,所以这种行为让我有点困惑.也许我正在经历文化冲击:-).

c pointers casting function-pointers type-safety

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

为具有浮点成员的类实现"容忍"`equals`和`hashCode`

我有一个有float田地的课.例如:

public class MultipleFields {
  final int   count;
  final float floatValue;

  public MultipleFields(int count, float floatValue) {
    this.count = count;
    this.floatValue = floatValue;
  }

}
Run Code Online (Sandbox Code Playgroud)

我需要能够按值比较实例.现在我该如何正确实施 equals&hashCode

通常的方式来实现equals,并hashCode是只考虑各个领域.例如,Eclipse将生成以下内容equals:

  public boolean equals(Object obj) {
    // irrelevant type checks removed
    ....
    MultipleFields other = (MultipleFields) obj;
    if (count != other.count)
      return false;
    if (Float.floatToIntBits(floatValue) != Float.floatToIntBits(other.floatValue))
      return false;
    return true;
  }
Run Code Online (Sandbox Code Playgroud)

(和类似的hashCode,基本上计算count* 31 + Float.floatToIntBits(floatValue)).

这个问题是我的FP值受到舍入错误的影响(它们可能来自用户输入,来自数据库等).所以我需要一个"宽容"的比较.

常见的解决方案是使用epsilon值进行比较(参见 …

java floating-point equals hashcode

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

Java EE Servlet是否实际直接使用?

我只是想开始使用Java EE和相关概念.但是,我在理解某些技术与它们扮演的角色之间的关系时遇到了一些麻烦.

据我所知,Java EE Servlet是一个在服务器内运行的Java类,它生成对请求的响应(通常是对HTTP请求的HTML响应,尽管Servlet理论上可以服务于任何协议).

我的问题:

  • 据我所知,我可以直接编写Servlet类,也可以使用JSP或JSF等技术,然后为我生成/提供Servlet.无论如何,我最终运行我的应用程序的Java EE Web容器(例如Apache Tomcat)将只看到Servlet,并且不关心它们是如何创建的(因此Servlet是一种低级管道).真的吗?
  • 如果Servlet是低级的,有没有理由直接使用Servlet?我已经看过许多解释如何编写Servlet的教程,但这看起来相当不实用.有没有直接编写Servlet更好/更喜欢使用JSP或类似的情况?
  • 最后,Servlets需要运行服务器(例如Apache Tomcat).在阅读该上下文中的服务器时,我已经看到了各种名称,例如(Java EE)Web容器,servlet容器,JSP容器Java EE服务器.这些术语是否都意味着相同,还是有区别?

谢谢你帮助我开始吧!

java servlets java-ee

10
推荐指数
3
解决办法
3617
查看次数

允许"布尔"和"对象"的等式比较?

以下代码

public class TestComparison {
    public static void main(String[] args) throws Exception {
        boolean b = true;
        Object o = new Boolean(true);
        System.out.println("comparison result: "+ 
            (o == b)); // Eclipse complains about this expression
    }
}
Run Code Online (Sandbox Code Playgroud)

使用javacV1.7.0_15 编译时没有错误,并在运行时打印"false".但是,Eclipse Juno抱怨"不兼容的操作数类型Object和boolean".

显然,javac自动装配了原始布尔值b,然后通过对象相等进行比较o和自动装帧b,产生false,而Eclipse拒绝进行自动装箱.

根据Java语言规范,哪种是正确的行为?我应该在哪里提交错误?

注意:如果我更改oto 的类型Boolean,事情按预期工作:Eclipse接受代码,代码打印"true".

ideone.com上的Runnable版本

java eclipse autoboxing javac

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

删除从未推送的本地Git分支 - 也在服务器上删除它?

我做了一个本地分支,但后来意识到我不需要它.

如果我从本地仓库删除它,我是否也必须从遥控器中删除?我刚刚创建了那个分支,并没有添加,提交或推送任何内容 - 简而言之,我没有做任何事情.

git branch push github

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

用于检测采样的分析仪

我正在研究剖面仪,主要是仪器和采样.我想出了以下信息:

  • 采样:停止程序的执行,取PC并由此推导出程序
  • 检测:向程序添加一些开销代码,以便增加一些指针以了解程序

如果以上信息错误,请纠正我.

在此之后,我正在查看执行时间,有些人说仪器需要比采样更多的时间!它是否正确?

如果是的话为什么?在抽样中你必须支付过程之间的上下文切换价格,而在后者你在同一个程序中没有成本

我错过了什么吗?

干杯!=)

profiler profiling sampling

9
推荐指数
2
解决办法
5364
查看次数